/// <summary>[Awake]</summary> void Awake() { //Managerにインスタンス追加 PlayerAndTerritoryManager.instance.AddPlayer(gameObject, this, m_playerMaualCollisionAdministrator, m_followPoints); //初期ポイントを探す GameObject firstPoint = GameObject.Find(m_firstPointName); m_instanceID = gameObject.GetInstanceID(); //マークポイントを取得 if (firstPoint != null) { m_firstPoint = firstPoint.GetComponent <BaseMarkPoint>(); } //初期ポイントが見つかった if (m_firstPoint != null) { //PlayerInfo取得 var playerInfo = PlayerAndTerritoryManager.instance.allPlayers[m_instanceID].playerInfo; //コールバック追加 playerInfo.changeTerritoryCallback += ChangeTerritory; //ポイントをリンクさせる m_firstPoint.LinkPlayer(gameObject, null); //即時計算要請 PlayerAndTerritoryManager.instance.CalucrateTerritory(playerInfo); //Info設定 m_playerMaualCollisionAdministrator.SetPlayerInfo(playerInfo); m_firstPoint.SetLockFirstPoint(true); m_isPauseFirstPoint = true; } else { //Debug only, エラーログを表示 #if UNITY_EDITOR Debug.LogError("Error!! PlayerTerritoryIntermediary->Start\n FirstPoint not found"); #endif } }
/// <summary> /// [AIUpdate] /// Updateフレームに呼ばれるコールバック関数, EndAIFunctionを呼び出す場合引数1が必要 /// 引数1: 更新識別子 /// </summary> public override void AIUpdate(UpdateIdentifier updateIdentifier) { //万が一の無効条件 if (m_markPoint == null) { EndAIFunction(updateIdentifier); return; } else if (m_markPoint.isLinked & m_markPoint.isPauseTimer) { EndAIFunction(updateIdentifier); return; } //state switch switch (functionState) { //突進 case State.Rushing: { //半径でOverlapを行う var hitCollisions = Physics.OverlapSphere(transform.position, m_rushingArrivalDistance, m_markPointLayerMask); //指定ポイントがヒットしているか確認 for (int i = 0, length = hitCollisions.Length; i < length; ++i) { //指定ポイントと合致 if (hitCollisions[i].gameObject.GetInstanceID() == m_markPoint.gameObject.GetInstanceID()) { //移動, 回転停止 navMeshAgent.isStopped = true; dogAIAgent.speedChanger.SetManualAcceleration(0.0f); //回転を決める Vector3 absolute = m_markPointPosition - transform.position; absolute.y = 0.0f; m_targetRotation = Quaternion.LookRotation(absolute.normalized) * Quaternion.AngleAxis(-90, Vector3.up); //Stateを進める functionState = State.Rotation; //Animation Set m_animationController.editAnimation.SetTriggerMarking(); //Timer再スタート timer.Start(); break; } } break; } //回転 case State.Rotation: { //指定時間経過でステートを進める if (timer.elapasedTime >= m_rotationSeconds) { m_sePlayer.PlaySE(m_markingSEIndex, true); m_markingEffect.SetActive(true); functionState = State.Marking; timer.Start(); } //回転 transform.rotation = Quaternion.Slerp(transform.rotation, m_targetRotation, m_rotationSpeed * Time.deltaTime); break; } //マーキング実行 case State.Marking: { //指定時間経過 if (timer.elapasedTime >= m_markingSeconds) { //ポイントをリンクさせる m_markPoint.LinkPlayer(dogAIAgent.linkPlayer, dogAIAgent); //待て! dogAIAgent.SetSitAndStay(true, m_markPoint); //Animation Set m_animationController.editAnimation.SetTriggerSleepStart(); //終了 EndAIFunction(updateIdentifier); } break; } default: break; } }