Unityのゲームでバイオハザード風に照準を合わせられるようにする

前回の記事で銃を構えて、銃からレーザーポインタが表示され(厳密には銃からじゃなくレーザーポインタからレーザーでしょうが・・・)、弾が当たったかどうか判定するところまで作成しました。

Unityでバイオハザード風ガンシューティングの機能を作ってみます。今回は銃を構えた時にレーザーポインターの表示とシューティングポイントの表示、銃を撃った時に光を表示してみたいと思います。

しかし一度構えてしまうと構えた状態から動けず照準を敵に合わせるという事が出来ませんでした。

今回は銃を構えた状態で照準を合わす事が出来るようにします。

また照準をブレさす(日本語がおかしい?謎)機能も追加します。

↑のような感じに仕上がりました。

バイオハザードとはちょっと違いますが、これはこれで面白く出来そうな気がします。(^^)/

スポンサーリンク

銃を構えた状態で上半身を動かす為の設定

照準を合わすには銃を構えた状態で↑↓←→のキーを押した時に上半身だけを一定方向に向かせるようにします。

まずは主人公のアニメーターコントローラーを変更します。

バイオ12

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

こうするとOnAnimatorIKというイベントが発生するようになるので、そのイベントを受け取り実行する関数を主人公操作スクリプトのMove内に記述していきます。

とします。

この特別な関数では、例えばキャラクターの手の位置を他のオブジェクトの位置に合わせたい時などに使用します。

これに関しては

UnityのIKを使ってキャラクターがはしごを登るようなアニメーションを作成していきます。

を参考にしてください。

体の一部(ボーン)を動かすスクリプト

今まで主人公操作スクリプトはMoveという名前にしていましたが、攻撃機能等を取り付けたのでPlayerという名前に変更します。

他のスクリプトでMoveスクリプトを設定していた箇所もPlayerに変更してください。

それではPlayerスクリプトにボーンの角度を変更する処理を追記していきます。

フィールド宣言部

まずはフィールド宣言部です。

キーボードの上下左右のキーを押した時にSpine(脊椎)のボーンのX軸とZ軸を元に回転させますので、その回転値を宣言します。

無限に回転が出来ると人間ではなくなるので、それぞれ変化出来る限界角度を指定しておきます。

また銃を構えた時のSpineにあたるボーンのX軸とZ軸の角度を調べておき、その角度を初期角度として保持しておきます(アニメーションによって角度は変わります)。

構え終わった時に角度を取得して設定しようとしましたが、その設定するタイミングが難しい為、手動で設定します。

今回キャラクターにはEthanを使い、SpineにあたるボーンはSpine1となっていますが、キャラクターに取り付けたボーンによってはX、Y、Z軸の向きが違う場合があるので、キャラクターによってX、ZではなくXとYを使う可能性もあるので注意してください。

rotateSpeedは1秒間に回転する角度を指定します。

isHandBlurは手ブレを使用するかどうかで、handBlurDegreeは手ブレの度合いを設定します。

waitShotFlagは銃を構え終わった時にtrueにします。

手ブレを使用する時に右肩と左肩のボーンを動かすので、銃を構え終わった時のRightShoulderとLeftShoulderの値を調べ、あらかじめ設定しておきます。

Spineの時と同様にアニメーションによって角度は変わります。

OnAnimatorIKメソッド

OnAnimatorIKメソッドの中身は以下のようになります。

↑↓←→のキーが押されている間はxAxisとyAxisの値を変化させます。

それぞれの限界角度を超えていた場合は限界角度を設定し直します。

角度の変更値に初期角度を足してボーンの角度を計算しますが、360度を越えては困るので360の余りを求めます。

でHumanBodyBones.Spineに設定されている骨の部分の角度をさきほど指定した値に設定します。

Y軸の角度は変更しないのでそのままの角度を設定します。

キャラクターによっては↑のキーを押したら右に傾くといった事もあります。

Boneの設定の仕方やBoneの向いている角度が問題だと思われます。

なので角度指定の場所でZに指定していたyをYの所に指定したりして、調整します。

例えば以下のように設定する可能性もあります。

↑はあくまでも例です。

Input.GetButton(“Fire2”)を押していない時は角度の増減に利用したxAxis、zAxisは0にしておきます。

でないと構えが終わった後もキャラクターの上半身の角度が変わったまま歩いたりしてしまう為です。

Input.GetButton(“Fire2”)を押していない時という条件が入っているのは、押して上半身の角度を変えている時に敵から攻撃を受けた際に角度がリセットされるのを防ぐためです。

銃を構え終わった時に実行するメソッド

銃を構え終わった時に実行するメソッドを作成します。

アニメーションクリップの最後にReadyShotというイベントを作ります。

アニメーションイベントに関しては

Unityのアニメーションイベントを使い、歩くアニメーションで地面に足を着いた時に足音を鳴らしたり剣を振っている途中で剣を振った時の音を鳴らしたりしたいと思います。

を参考にしてください。

アニメーションイベントを受け取っているProcessMyAttackというスクリプト内(名前はそれぞれ違うと思いますが)でキャラクター操作スクリプトのSetReadyShotを呼び出すようにします。

主人公操作スクリプトのSetReadyShotメソッドを呼び出します。

EnemyスクリプトのTakeDamageメソッドを変更する

主人公の上半身の角度を変更出来るようになったので、敵の当たり判定の色々な部分を銃で攻撃出来るようになりました。

そこで敵のダメージエフェクトを表示する場所を剣や銃で狙った場所に表示するように変更してみます。

剣の場合はAttackSwordスクリプトで剣のコライダがOnTriggerEnterで敵のコライダと接触した時に、接触した位置に一番近い接触位置をTakeDamageに引数として渡します。

銃の場合はShotスクリプトでPhysics.Raycastでレイの当たった位置をRaycastHit型の変数で得られるので、当たったコライダのTransformと当たった位置をTakeDamageの引数として渡します。

当たったコライダのTransformはダメージエフェクトの親を当たったコライダのTransformにする為の情報として渡します。

AttackSwordスクリプトを修正します。

剣がEnemyタグを持つコライダと接触した時に接触した相手のコライダのClosestPointOnBoundsメソッドの引数に剣の位置を渡し、コライダの一番近い位置を取得しています。

ShotスクリプトのJudgeShotメソッドを修正します。

EnemyスクリプトのTakeDamageメソッドを呼び出している箇所でヒットしたコライダのTransformとヒットした位置を引数として渡します。

EnemyスクリプトのTakeDamageを修正します。

Unity独自の型だとオプション引数が使えなかったので、オーバーロードを使う事にしました。

主人公に設定したPlayerスクリプトのインスペクタで角度の設定をして、確認してみてください。

バイオ13

上のように上半身の角度の変更が出来るようになりました。

これでかなりガンシューティングっぽくなってきました。

終わりに

これで構え終わってから上半身の角度の変更が出来るようになります。

改良してだいぶよくなりました(2017/12/29)。

ここまで来たらほぼバイオハザードですね(違)
(;一_一)

次回は敵キャラの当たり判定が大雑把なのでもう少し厳密にしてみようかと思います。

スポンサーリンク

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

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