キャラクターのラジコン操作機能と徐々に追いかけるカメラを作成する

前回まではUnityで使うキャラクターにカメラを追従させキャラクターは上のキーを押せば奥側に下のキーで手前側に移動させ、そちらの方角にキャラクターを向けさせていました。

全体を見回すアクションゲームであればその方がアクション性が高くなって面白いです。
市販ゲームで言えば三国無双系。

ガンシューティング風の場合はカメラはキャラクターの頭の後ろに常にあり、向きを変えたらカメラもキャラクターの後ろに回り込み、上のキーを押したらキャラクターの向いている方角に移動し、右や左のキーを押したらキャラクターの向きを変えるようにしたいです。
市販ゲームで言えばバイオハザード4や5系、いわゆるラジコン操作というやつです。

今回はそのバイオ系のラジコン操作が出来るようにします。

新しくC#で処理を書き直したものとカメラの移動に関するスクリプトも追記しました。

前の記事から読み進めている人やJavaScriptで処理を書いている人用に前の内容も残してあります。(2017/08/03)

スポンサーリンク

バイオハザード風のキャラクターの動かし方(前の記事を修正していく場合)

public var rotateSpeed : float;

という1秒間でキャラクターが回転する角度を指定出来るようにします。

キャラクターが歩く時の処理を行う場所で移動キーが押された時に↑↓のキーの時はキャラクターを前後の進め、
←→のキーの時はキャラクターの向きを変更します。

方向キーを押している度合いを取得し、velocityに入れます。

velocity.magnitudeが0.1fより大きければ、前進もしくは回転をさせます。
Input.GetKeyで左右のキーが押されているか判定し、押されている間はキャラクターのY軸の角度にwalkRotateの角度を足していきます。

最後にvelocity.xの値は0に初期化しておきます。
Input.GetAxis(“Horizontal”)で得た値は回転にのみ使用し、移動はInput.GetAxis(“Vertical”)の値だけ使う為です。

次にキャラクターを移動させている個所を変更します。

まずはVector3.zeroでdirをVector3(0, 0, 0)に初期化します。

velocity.zつまり↑↓のキーを押している時の強さが0.1fを超えていた時または-0.1fより下の時にキャラクターを移動させます。

transform.forwardはキャラクターが向いている方向なのでそこに移動力velocity.zをかけます。
その後、重力値を加味する為に

dir.y += velocity.y * Time.deltaTime;

とします。

cCon.Move(dir * speed * Time.deltaTime);

で実際に移動させます。ここは通常のキャラクター移動と同じですね。

次にMainCameraを主人公キャラの子要素にして、キャラクターを追従するスクリプトを設定していたらスクリプトコンポーネントのチェックを外します。

カメラの位置を調整すればカメラは主人公キャラの子要素なのでキャラクターと一緒にカメラが移動します。

これでキャラクターをラジコン操作で動かせるようになりました。

Unityの実行ボタンを押して試してみましょう。

walkrotate

上のように移動するようになりました!

キャラクターの頭の後ろにカメラを固定したアクションゲームを作りたい時に参考になると思います。

バイオハザード風のキャラクターの動かし方(C#で書き直したバージョン)

この記事は前の記事から作成しているスクリプトへの追記と修正という形で作っていた内容なのでこの記事だけで完結するようにC#でスクリプトを作りなおしてみました。

作り直すだけだとすぐ終わってしまうので、ラジコン操作キャラクターを徐々に追いかけるカメラも作成してみます。

AnimatorControllerの作成

前に進む、後ろに進む、左に回る、右に回るといった動作を個別の状態として作成しアニメーションを変更します。

アニメーションパラメータには右周りか左回りかでアニメーションを変更する為、float型のRotateを作成します。

ラジコンキャラクターのAnimator

↑のような状態と遷移を作成します。

Idle→WalkはSpeedがGreaterで0.1
Walk→IdleはSpeedがLessで0.1でSettingsのInterrupt SourceにNext Stateを設定します。
Idle→WalkBackはSpeedがLessで-0.1
WalkBack→IdleはSpeedがGreaterで-0.1でSettingsのInterrupt SourceにNext Stateを設定します。

Idle→RightRotateはRotateがGreaterで0.1
RightRotateはRotateがLessで0.1でSettingsのInterrupt SourceにNext Stateを設定します。
Idle→LeftRotateはRotateがLessで-0.1
LeftRotate→IdleはRotateがGreaterで-0.1でSettingsのInterrupt SourceにNext Stateを設定します。

Interrupt SourceにNext Stateを設定したのは次の状態での遷移条件が成立したらすぐさま次のアニメーションへと移行させる為です。

これでAnimatorControllerの作成が終了しました。

キャラクター操作スクリプトの作成

キャラクター操作はキーボードで言うと↑↓のキーを押したらキャラクターが向いている方向の前後に動き、←→のキーを押したらキャラクターを回転するだけにします。

JavaScriptで書いたスクリプトとやっている事は同じなので解説はいらないと思いますが、←→のキーを押している時はキャラクターのY軸を押した方向に回転しています。

hInputの値をそのままアニメーションパラメータのRotateに渡す事でLeftRotate、RightRotateの切り替えが出来ます。

前後にキャラクターを動かす場合もやっている事は同じでキャラクターが向いている方向(transform.forward)にvInputの値をかけて移動値を計算しています。

これで移動スクリプトが完成です。

キャラクターにスクリプトを設定します。

RadioControlの設定

Main Cameraをキャラクターの子要素に配置するとキャラクターの前方方向にカメラが向くのでカメラの移動や回転について考慮する必要はありません。

それでは実行してみます。

↑のようになりました。

キャラクターが↑↓のキーで前後に動き、←→のキーでキャラクターを回転させています。

最初に上下のキーを押してから左右のキーを押すと前後のアニメーションで斜めに動き、最初に左右のキーをおしてから上下のキーを押すと左右のアニメーションのまま斜めに動きます。

斜め前は特定のアニメーションにしたい時はAnimatorControllerを細かく作る必要があります。

Unityのブレンドツリーを使ってアニメーションの切り替えを細かく設定し、向きを変える時の角度によってアニメーションを変更するようにします

カメラをキャラクターの子要素に配置した事でキャラクターの向きに合わせてカメラが相対的に移動しています。

カメラが徐々にキャラクターを追従するようにする

カメラをキャラクターの子要素に配置するとキャラクターと相対的に動くのでカメラ自体に特別な処理は必要ありません。

ですがキャラクターの移動と同時ではなく、少し遅れてカメラがキャラクターを追いかけるようにしたい場合もあります。

そんな時はカメラにスクリプトを取り付けカメラの位置を徐々にキャラクターの後ろ側に回り込ませるようにする必要があります。

basePosはキャラクターからの相対値を指定します。

インスペクタでbasePosのY軸とZ軸の値を操作することでキャラクターからの位置を調整出来ます。

LateUpdateメソッド内でVector3.Lerpを使い、カメラの位置をカメラの位置+basePosの値へと少しづつ移動させます。

その後キャラクターとカメラの間に障害物があるかどうかを確認し、障害物があったらカメラ位置を障害物の位置へと移動させます。

FieldかBlockレイヤーが設定されているゲームオブジェクトのみ障害物として判定しています。

一度カメラ位置を変更した後に再度レイを飛ばして障害物を確認しているのはリアルタイムにカメラ位置を計算する為です。

先にレイで障害物があるかどうか判定しそこに移動、障害物がなければLerpで徐々に移動、と条件分岐するとカメラ位置は障害物にレイが当たっている間動きません。

その為、最初にLerpでカメラ位置を変更した後にレイを飛ばして障害物の判定をしています。

カメラ位置はこれでキャラクターの後ろ側に移動するようになりますが、カメラの向きを変更していないのでカメラがキャラクターを向くように回転しなければいけません。

カメラの回転速度を考慮しない場合はtransform.LookAtを使うと簡単にキャラクターを向かせる事が出来ます。

徐々にカメラがキャラクターを向くようにするには補間メソッドを使用する必要があります(今回はQuaternion.SLerpを使用しています)。

スクリプトが出来たのでMain Cameraをキャラクターの子要素から元の親要素を持たない場所にドラッグ&ドロップし、AutoRotateCameraスクリプトを設定します。

AutoRotateCameraの設定

charaTraにはLookAtPointというゲームオブジェクトが設定されていますが、これはキャラクターをそのまま設定すると足元が基点となっている為、カメラがキャラクターの足元を見てしまいます。

そこでキャラクターの子要素に空オブジェクトを作成しそこを見るようにします。

カメラとキャラクターの階層とLookAtPoint

↑が実際のカメラやキャラクター、LookAtPointのヒエラルキーです。

LookAtPointをキャラクターの頭のあたりに移動し、AutoRotateCameraのcharaTraに設定します。

これで機能が完成しました。

ラジコンキャラクターと徐々に追従するカメラの確認

機能が出来上がったので確認してみましょう。

↑のようになりました。

カメラのbasePosが近くてカメラの移動スピードが遅いとキャラクターの中身が見えてしまう事があります。

ここら辺はパラメータの調整が必要ですね。

最後の方でモノリスで障害物の確認をしています。

ここは月だったのか!?(謎)

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます