Ejemplo n.º 1
0
    /// <summary>
    /// @brief 当たった時に実行される処理
    /// </summary>
    /// <param name="other"> アタッチされているオブジェクト以外 </param>
    private void OnTriggerEnter(Collider other)
    {
        // 当たったゲームオブジェクトが、目的のマーカーの場所と一致した場合
        if (other.gameObject == hitMarkerList[currentHitMarker].gameObject)
        {
            // スタートとゴールが同じ場所にあった時にゴール判定にならないようにする処理
            if (other.tag == "goal")
            {
                isGoal           = true;
                currentHitMarker = 1;
                AIStatus         = eAIStatus.eGoal;
            }
            else
            {
                // 現在通ったマーカーの総数を計算
                currentHitMarker += 1;
                AIStatus          = eAIStatus.eTurn;
                if (currentHitMarker % 2 == 1 && AISequence != eAISequence.NULL)
                {
                    AISequence = eAISequence.NULL;
                }
            }
        }

        // 当たったゲームオブジェクトが、目的のブイの場所と一致した場合
        if (other.gameObject == hitMarkerList[currentMarker].gameObject && other.tag != "goal")
        {
            // 現在通ったブイの総数を計算
            currentMarker++;
        }
    }
Ejemplo n.º 2
0
    private eAISequence AISequence; // @brief 現在のジグザグのシーケンス

    #endregion

    #region 初期化

    /// <summary>
    /// @brief MarkerBaseの実装
    /// </summary>
    protected override void MarkerInitialize()
    {
        base.MarkerInitialize();

        // リストの初期化
        markerPos    = new List <Vector2>();
        AIMarkerList = new List <GameObject>();
        AIMarkerList = GameObjectExtension.GetGameObject(markerObjName, DecideAIStrength());

        // コンポーネントの取得
        me           = this.gameObject;
        mySail       = me.transform.Find("Sail").gameObject;
        myHuman      = me.transform.Find("Human").gameObject;
        getWindParam = GameObjectExtension.Find("UIWind").GetComponent <GetWindParam>();

        // 変数の初期化
        myRadius         = transform.localEulerAngles.y;
        currentMarker    = 0;
        currentHitMarker = 1;

        AIStatus   = eAIStatus.NULL;
        AISequence = eAISequence.NULL;

        GetMarkerVec2();
        currentDistance = Distance(myPos, markerPos[currentHitMarker]);

        NextPointDeg();
        SailRotate(getWindParam.ValueWind, me.transform.localEulerAngles.y);
    }
Ejemplo n.º 3
0
    private eAISequence AISequence;     // @brief 現在のジグザグのシーケンス

    #endregion

    #region 初期化

    /// <summary>
    /// @brief MarkerBaseの実装
    /// </summary>
    protected override void MarkerInitialize()
    {
        base.MarkerInitialize();

        // リストの初期化
        markerPos    = new List <Vector2>();
        AIMarkerList = new List <GameObject>();
        AIMarkerList = GameObjectExtension.GetGameObject(markerObjName, DecideAIStrength());

        // コンポーネントの取得
        me           = this.gameObject;
        mySail       = me.transform.Find("Sail").gameObject;
        getWindParam = GameObjectExtension.Find("UIWind").GetComponent <GetWindParam>();

        // 変数の初期化
        myRadius         = transform.localEulerAngles.y;
        currentMarker    = 0;
        currentHitMarker = 1;

        // ステートの初期化
        AIStatus     = eAIStatus.NULL;
        AISequence   = eAISequence.NULL;
        AIMoveStatus = eAIMoveStatus.NULL;

        // 角度の取得
        GetMarkerVec2();

        // 取得した角度の初期化
        NextPointDeg();

        // セールの角度の初期化
        SailRotate(getWindParam.ValueWind, me.transform.localEulerAngles.y);

        // 旋回速度の初期化
        ChangeShipTurnSpeed();
    }
Ejemplo n.º 4
0
    /// <summary>
    /// @brief ジグザグに動く処理
    /// </summary>
    /// <param name="turnDegree"> 次のブイの角度 </param>
    private void MoveTypeZIGUZAGU(float turnDegree)
    {
        switch (AISequence)
        {
        case eAISequence.NULL:
            // ジグザグの準備
            AISequence     = eAISequence.eSetUp;
            markerDistance = Vector3.Distance(me.transform.position, markerPos[currentHitMarker]);
            myZIGUZAGUPos  = me.transform.position;
            break;

        case eAISequence.eSetUp:

            // 最高速度が上がるまで船に角度をつける
            if (Mathf.Abs(me.transform.localEulerAngles.y - 180) < 30)
            {
                // 一度曲がる方向が決まったら入らないようにする。
                if (tempStatus == eAIMoveStatus.NULL)
                {
                    if (SwitchTurning() == eAIMoveStatus.eLeft)
                    {
                        tempStatus = eAIMoveStatus.eLeft;
                    }
                    else if (SwitchTurning() == eAIMoveStatus.eRight)
                    {
                        tempStatus = eAIMoveStatus.eRight;
                    }
                    else
                    {
                        tempStatus = eAIMoveStatus.NULL;
                    }
                }

                // 実際に曲げる
                if (tempStatus == eAIMoveStatus.eLeft)
                {
                    me.transform.Rotate(rotateL);
                }
                else if (tempStatus == eAIMoveStatus.eRight)
                {
                    me.transform.Rotate(rotateR);
                }
            }
            // 次のシーケンスへ
            else
            {
                AISequence = eAISequence.eFirst;
            }

            break;

        case eAISequence.eFirst:

            // マーカーまで半分走ったら次のシークエンス
            if (Vector3.Distance(me.transform.position, myZIGUZAGUPos) > markerDistance * 0.5)
            {
                AISequence   = eAISequence.eSecond;
                AIMoveStatus = eAIMoveStatus.NULL;
            }

            break;

        case eAISequence.eSecond:

            // 左
            if (Mathf.DeltaAngle(myRadius, turnDegree) < 0)
            {
                me.transform.Rotate(rotateL);
            }
            // 右
            else if (Mathf.DeltaAngle(myRadius, turnDegree) > 1)
            {
                me.transform.Rotate(rotateR);
            }
            // ブイに来たらそのまままっすぐ
            else
            {
                AISequence = eAISequence.eThird;
            }

            break;

        case eAISequence.eThird:
            // 次のカーブまでこのままのシーケンスを保つ
            // カーブが来たら次のシーケンスへ
            break;

        case eAISequence.eLast:
            // 状態を初期化
            tempStatus = eAIMoveStatus.NULL;
            AISequence = eAISequence.NULL;
            break;
        }
    }
Ejemplo n.º 5
0
    /// <summary>
    /// @brief ジグザグに動く処理
    /// </summary>
    /// <param name="turnDegree"> 次のブイの角度 </param>
    private void MoveTypeZIGUZAGU(float turnDegree)
    {
        // このフレームでのブイ目での距離
        currentDistance = Distance(myPos, markerPos[currentHitMarker]);

        switch (AISequence)
        {
        case eAISequence.NULL:
            // ジグザグの準備
            AISequence     = eAISequence.eSetUp;
            markerDistance = Distance(myPos, markerPos[currentHitMarker]);
            myZIGUZAGUPos  = transform.position;
            return;

        case eAISequence.eSetUp:

            // 最高速度が上がるまで船に角度をつける
            if (AITopSpeed < 40)
            {
                if (NextTurnDirection(turnDegree) == eAIMoveStatus.eLeft)
                {
                    transform.Rotate(rotateL);
                }
                else
                {
                    transform.Rotate(rotateR);
                }
            }

            else
            {
                AISequence = eAISequence.eFirst;
            }

            return;

        case eAISequence.eFirst:

            // マーカーまで半分走ったら次のシークエンス
            if (Distance(myPos, myZIGUZAGUPos) > markerDistance * 0.5)
            {
                AISequence = eAISequence.eSecond;
            }

            break;

        case eAISequence.eSecond:

            // マーカーの方向に船の角度を戻して進む
            if (NextTurnDirection(turnDegree) == eAIMoveStatus.NULL)
            {
                AISequence = eAISequence.eLast;
            }
            else
            {
                ShipRotate(NextPointDeg());
            }

            break;

        case eAISequence.eThird:
            AISequence = eAISequence.eLast;
            break;

        case eAISequence.eLast:
            AISequence = eAISequence.NULL;
            AIStatus   = eAIStatus.NULL;
            break;
        }
    }