/// <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++; } }
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); }
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(); }
/// <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; } }
/// <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; } }