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

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

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

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

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

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

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

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

スポンサーリンク

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

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

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

バイオ12

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

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

とします。

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

これに関しては

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

を参考にしてください。

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

体の一部を動かすスクリプトを作成していきます。

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

フィールド宣言部

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

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

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

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

後で銃を構え終わった時に角度を取得して設定しますが、念の為rightShoulderAngleとleftShouderAngleに手動で初期角度を設定します。

調べる方法はアニメーターコントローラーのIdleに銃を構えるアニメーションを設定し、銃を構え終わった時の主人公の右肩と左肩のTransformのRotationの値を調べます。

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

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

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

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

OnAnimatorIKメソッド

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

銃を構える状態で銃を構え終わっている時に↑↓←→のキーが押されている間はspineXAxisとspineZAxisの値を変化させます。

それぞれの限界角度を超えないようにMathf.Clampを使って数値を最低値と最大値の間に制限します。

角度の変更値に初期角度を足してボーンの角度を計算しますが、360度を越えては困るのでMathf.Repeatを使って0~360以内に納めます。

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

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

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

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

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

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

↑はあくまでも例です。

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

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

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

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

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

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

銃を構え終わった時の角度が設定されていなければそれぞれの角度を保持します。

InitializeShotメソッドを呼び出すためにアニメーションクリップの最後にReadyShotというイベントを作ります。

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

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

を参考にしてください。

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

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

これで銃を構えるアニメーションで銃を構えたらReadyShotというアニメーションイベントが発生し、それをProcessCharaAnimEventで受け取ってキャラクター操作スクリプトCharacterScriptのInitializeShotメソッドが呼ばれます。

その時に『銃を構え終わった』というisHoldGunをtrueにし、角度を保持しています。

上半身が動くか確認する

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

バイオ13

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

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

終わりに

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

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

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

スポンサーリンク

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

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