Unityで滑らかにターゲットの方向を向くようにする

記事内に広告が含まれています。

今回は自身のサーチエリア内に敵がいて特定のボタンを押した時にその敵の方向を向き体の向きも変えてみようと思います。

例えば敵が自分の近くにいる時に剣や銃を構えるボタンを押した時にその敵の方向に体を回転させ敵の方向を向くようにします。

以前の記事でも同じような機能を作成しましたが、今回はより簡素にした機能になります。

以前の記事は

Unityのアクションゲームで攻撃時に敵の方向をむかせる機能
Unityのアクションゲームで主人公が敵を攻撃する時に武器を構えたら一番近くにいる敵の方向を向かせます。また左右の方向キーを押したら角度が近い敵に標的を変更します

になります。

こちらは他の機能に追記してる形になるのでちょっとわかり辛いかもしれませんね・・・。

スポンサーリンク

動かすキャラクターを作成する

まずはゲームステージを移動するキャラクターを作成します。

モデルの配置とコンポーネントの取り付け

モデルを配置しCharacterControllerとRotateMoveという名前のスクリプトを取りつけます。

動かすモデルを配置する

↑のようにモデルを配置します。

CharacterControllerとRotateMoveを取りつける

モデルにはCharacterControllerを取りつけコライダのサイズを調整します。

動かすキャラクターとコライダのサイズ

↑がコライダのサイズを調整した時の画像です。

キャラクター操作スクリプトRotateMoveを作成する

新しくRotateMoveというスクリプトを作り取りつけます。

RotateMoveスクリプトはキャラクターを移動させるのとtargetがnullでなければそちらの方向にキャラクターを向ける処理です。

マウスの右ボタンを押した時でかつターゲットが設定されている時に実行します。

ターゲットのY軸だけを自身のY軸の位置にして体全体が上を向いてしまわないようにしています。

targetDirはターゲットの方向を取得し、transform.forward(自身の前方の向き)をtargetDirに少しづつ回転させています。

その方向からQuaternion.LookRotationを使ってQuaternion値を取得しtransform.rotationに入れています。

その為少しづつキャラクターがターゲットの方向を向くようになります。

OnAnimatorIKメソッドはAnimatorのLayerでIK Passにチェックを入れると呼ばれるようになるメソッドです。

AnimatorのIKPassにチェックを入れる

↑のようにAnimatorのBase Layerの歯車をクリックしIK Passにチェックを入れます。

SetTargetメソッドは敵をサーチするスクリプトから呼ばれて実行するメソッドで、受け取った引数をtargetに入れます。

敵をサーチするエリアとスクリプトを作成する

次は敵をサーチするエリアを作成します。

サーチするエリアを空オブジェクトで作成

↑のように操作キャラクターの子要素に空オブジェクトを作成し名前をSearchAreaとします。

SphereColliderとSearchTargetスクリプトを取りつける

SearchAreaにはSphere Colliderを取りつけIs Triggerにチェックを入れます。

Spherer Colliderのサイズを変更しサーチするエリアを設定します。

円状のサーチエリアが完成

↑のように円状のサーチエリアが完成しました。

次に敵の侵入を検知するスクリプトSearchTargetを作成します。

OnTriggerEnterとOnTriggerExitを使い敵がサーチエリアに侵入したか?出て行ったか?をチェックしています。

OnTriggerEnterをOnTriggerStayにすると常時敵の侵入を監視出来ます。

実際にターゲットを指定するのはRotateMoveスクリプトのSetTargetメソッドなので引数を与えて呼び出しています。

これで操作キャラクターの機能は完成しました。

ターゲットである敵キャラクターを設置する

ターゲットである敵キャラクターを何体か設置しましょう。

今回はモデルを配置しCharacterControllerを取りつけコライダを調整しただけにします。

またSearchTargetスクリプトで敵を把握するのにタグのEnemyであるかどうかで判定していますので、敵キャラクターにはEnemyタグを設定しておきます。

CharacterControllerを取りつけタグにEnemyを設定

↑のように設定しました。

敵キャラクターは動かさずそのままの位置に置いておきます。

地面と空中に1体ずつ設置

↑のようにあらかじめ空中と地面に接地するぐらいの位置においておきます。

操作キャラクターを動かし敵キャラクターの方を向くか確認する

それでは機能が完成したので操作キャラクター(ゾンビ)で敵キャラクター(こちらもゾンビ)に近づけターゲットに敵キャラクターが設定されたら、

マウスの右ボタンを押して敵キャラクターの方を向くかどうか確認します。

敵キャラクターの近くでマウスの右ボタンを押す

敵キャラクターが近くにいる時にマウスの右ボタンを押すとそちらの方向に操作キャラクターが向いていますね。

ターゲットが設定されるとすぐにIKが働き体の向きが変わっていますがこれはマウスの右ボタンを押している時のみ作用するようにした方がいいかもしれませんね。

↑のようにマウスの右ボタンが押されているかどうかをbool型の変数で宣言します。

マウスの右ボタンが押されている時はmouseDownにtrue、そうでない時はfalseを入れます。

OnAnimatorIKの条件でmouseDownがtrueであるというのを追加すればマウスの右ボタンを押している時だけそちらの方向に体が向くようになります。

終わりに

今回のスクリプトをそのままゲームに使おうと思うと複数の敵がサーチエリアにいる時に動作がおかしくなります。

ここら辺の処理は最初に紹介した記事

Unityのアクションゲームで攻撃時に敵の方向をむかせる機能
Unityのアクションゲームで主人公が敵を攻撃する時に武器を構えたら一番近くにいる敵の方向を向かせます。また左右の方向キーを押したら角度が近い敵に標的を変更します

の中で対処しているのでそちらも参考にしてください。

細かい部分では足りない所がありますが敵が近くにいる時に武器を構えるボタン(今回はマウスの右ボタンを押した時)を押すと敵の方向を向かせる事が出来ました。

以前の記事よりはわかりやすいかも!?

タイトルとURLをコピーしました