前回まではUnityで使うキャラクターにカメラを追従させキャラクターは上のキーを押せば奥側に下のキーで手前側に移動させ、そちらの方角にキャラクターを向けさせていました。
全体を見回すアクションゲームであればその方がアクション性が高くなって面白いです。
市販ゲームで言えば三国無双系。
ガンシューティング風の場合はカメラはキャラクターの頭の後ろに常にあり、向きを変えたらカメラもキャラクターの後ろに回り込み、上のキーを押したらキャラクターの向いている方角に移動し、右や左のキーを押したらキャラクターの向きを変えるようにしたいです。
市販ゲームで言えばバイオハザード4や5系、いわゆるラジコン操作というやつです。
今回はそのバイオ系のラジコン操作が出来るようにします。
今回の機能を作成すると、
上のように移動するようになりました!
今回の機能は以前から作成している機能に処理を追加しているので、このスクリプトは何?と思ったら以下の記事で今までの機能作成の流れを確認出来ます。
バイオハザード風のラジコン操作機能の作成
それではバイオハザード風にキャラクターを動かす機能を作成していきましょう。
AnimatorControllerの作成
前に進む、後ろに進む、左に回る、右に回るといった動作を個別の状態として作成しアニメーションを変更します。
アニメーションパラメータには右周りか左回りかでアニメーションを変更する為、float型のRotateを作成します。
↑のような状態と遷移を作成します。
Idle→WalkはSpeedがGreaterで0.1
Walk→IdleはSpeedがLessで0.1
Idle→WalkBackはSpeedがLessで-0.1
WalkBack→IdleはSpeedがGreaterで-0.1
Idle→RightRotateはRotateがGreaterで0.1
RightRotateはRotateがLessで0.1
Idle→LeftRotateはRotateがLessで-0.1
LeftRotate→IdleはRotateがGreaterで-0.1
上の全てのSettingsのInterrupt SourceにNext Stateを設定します。
Interrupt SourceにNext Stateを設定したのは次の状態での遷移条件が成立したらすぐさま次のアニメーションへと移行させる為です。
次に攻撃状態への遷移です。
Walk→AttackはAttackがトリガーされた時
WalkBack→AttackはAttackがトリガーされた時
WalkBack→Attackは遷移を作らなくてもいいかもしれません。
これでAnimatorControllerの作成が終了しました。
キャラクター操作スクリプトの作成
キャラクター操作スクリプトCharacterScriptの移動処理部分を変更します。
基本的なキャラクター操作スクリプトは
のようなスクリプトで移動処理をラジコン操作に変えていきます。
キャラクター操作はキーボードで言うと↑↓のキーを押したらキャラクターが向いている方向の前後に動き、←→のキーを押したらキャラクターを回転するだけにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | void Update() { // 接地していたら速度を初期化 if(characterController.isGrounded) { velocity = Vector3.zero; } if (state == MyState.Normal) { // 地面に接地してる時で銃を構えていない時 if (characterController.isGrounded && !isHoldGun) { // 回転処理 var hInput = Input.GetAxis("Horizontal"); if (hInput != 0f) { animator.SetFloat("Rotate", hInput); transform.Rotate(new Vector3(0f, hInput * rotateSpeed * Time.deltaTime, 0f)); } else { animator.SetFloat("Rotate", 0f); } // 移動処理 var vInput = Input.GetAxis("Vertical"); if (vInput != 0f) { animator.SetFloat("Speed", vInput); velocity += transform.forward * vInput * walkSpeed; } else { animator.SetFloat("Speed", 0f); } |
←→のキーを押している時はキャラクターのY軸を押した方向に回転しています。
hInputの値をそのままアニメーションパラメータのRotateに渡す事でLeftRotate、RightRotateの切り替えが出来ます。
前後にキャラクターを動かす場合もやっている事は同じでキャラクターが向いている方向(transform.forward)にvInputとwalkSpeedの値をかけて移動値を計算しています。
次にキャラクターの状態変更メソッドであるSetStateを修正します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public void SetState(MyState tempState) { state = tempState; velocity = Vector3.zero; animator.SetFloat("Speed", 0f); animator.SetFloat("Rotate", 0f); if (state == MyState.Normal) { } else if (state == MyState.Attack) { animator.SetTrigger("Attack"); } else if (state == MyState.Damage) { animator.SetBool("WaitShot", false); animator.SetTrigger("Damage"); } else if (state == MyState.WaitShot) { } } |
状態変更時に移動速度velocity、アニメーションパラメータのRotate、Speedを0に設定します。
これは攻撃や銃を構えた時に移動や回転に関するアニメーションパラメータをリセットし、攻撃や銃を構えるアニメーションに遷移させる為です。
これで移動スクリプトの修正が完了です。
Main Cameraをキャラクターの子要素に配置するとキャラクターの前方方向にカメラが向くのでカメラの移動や回転について考慮する必要はありません。
それでは実行してみます。
↑のようになりました。
キャラクターが↑↓のキーで前後に動き、←→のキーでキャラクターを回転させています。
最初に上下のキーを押してから左右のキーを押すと前後のアニメーションで斜めに動き、最初に左右のキーをおしてから上下のキーを押すと左右のアニメーションのまま斜めに動きます。
斜め前に移動する時に特定のアニメーションにしたい時はAnimatorControllerを細かく作る必要があります。
カメラをキャラクターの子要素に配置した事でキャラクターの向きに合わせてカメラが相対的に移動しています。
カメラをキャラクターの子要素に配置せずキャラクターを徐々に追いかけさせるには、
を参照してください。
ラジコンキャラクターの確認
機能が出来上がったので確認してみましょう。
↑のようになりました。
最後の方でモノリスで障害物の確認をしています。
ここは月だったのか!?(謎)