Example #1
0
    /// <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;
        }
    }