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

前回、

Unityでバイオハザード風ガンシューティングの機能を作ってみる
Unityでバイオハザード風のガンシューティングの機能を作成していきます。今回は銃を構えそこからレーザーポインタを表示するようにし敵に当たっている時に攻撃ボタンを押すと敵にダメージを与えます。

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

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

今回は銃を構えた状態で照準を合わす事が出来るようにします。
また照準をブレさす(日本語がおかしい?謎)機能も追加します。

スポンサーリンク

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

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

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

バイオ12


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

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

とします。

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

これに関しては

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

を参考にしてください。

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

今回は上半身に設定されている骨の位置を取得し、キーが押されたら回転するようにします。

まずは上のような変数を宣言します。
方向キーを押したらそちらにキャラクターの上半身を回転させます。

OnAnimatorIK関数の中身は以下のようになります。

特別難しい処理はしておらず、↑↓←→のキーが押されている間はxとyの値を変化させます。
制限角度を超えたら限界角度を指定します。

構え終わった時にその時のBoneのSpineの角度を初期値として記憶しておきます。
一度記憶したら後は必要ないのでフラグをオンにしています。

Input.GetKeyはそのキーが押されている間ずっとtrueになります。

animator.SetBoneLocalRotation(HumanBodyBones.Spine, Quaternion.Euler(x, y, 0));

でHumanBodyBones.Spineに設定されている骨の部分の角度をさきほど指定した値に設定します。
キャラクターによっては↑のキーを押したら右に傾くといった事もあります。

Boneの設定の仕方やBoneの向いている角度が問題だと思われます
なので角度指定の場所でZに指定していたyをYの所に指定したりして、調整します。

animator.SetBoneLocalRotation(HumanBodyBones.Spine, Quaternion.Euler(y, x, 0);

↑はあくまでも例です。

またSpineを動かすとしたら、そこに指定しているBoneの角度が0でなかった場合、構えている角度にブレが発生するので、Spineの部分には角度が0のBoneを指定した方がいいです。

それが出来ない場合は打つ準備が出来た時に呼ぶ関数で、アニメーターの骨の位置情報を取得しておき、そこからローカルの角度を初期位置として記憶しておきます。

これに関しては後で作成します。

初期の角度はinitXとinitYに保存しておき、そこにxとyの値を足す事で角度を変化させていっています。

また横、縦のキーを押していない時は構えている状態で静止している時なので、その時は照準のブレの設定があり・なしで判断し、ある場合はブレを角度に足しています。

xやy自身の値に足さないのは限度角度を超えて移動してしまう可能性があるためです。

また状態がState.waitshotでなくなった場合でInput.GetButton(“Fire2”)を押していない時は角度の増減に利用したx、yは0にしておきます。
でないと構えが終わった後もキャラクターの上半身の角度が変わったまま歩いたりしてしまう為です。

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

今回は↑のキーを押したら上の方を向き、↓のキーを押したら下の方を向くようになっていますが、ゲームの管理をするManagementスクリプトに方向キーの設定を設けて(今回の記事ではやりません)

↑のキーを押したら下を向き、↓のキーを押したら上を向くといった設定も出来るようになります。

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

バイオ13

上のように上半身の角度の変更が出来るようになりました。
これでかなりガンシューティングっぽくなってきました。

銃を構え終わる前に体の角度の値を変更してしまっている

今のままだと右クリックを押して構える終わる前の段階で↑↓←→のキーを押していると上半身の角度の変化値を更新し始めています。

つまり前方に移動中に銃を構えるボタンを押すと初めから上の方を狙ってしまっていることになります。
(アニメーションで構え終わった段階で変化値分一気にそちらを向いてしまいます)

なので構えるボタンを押してから前方を向いて初めて上半身の角度を変化させるようにします。

MoveスクリプトにprepareShotというboolean型の変数を用意し、SetPrepareShotという関数でOn出来るようにします。

この関数が呼ばれるのは構えが完了してからなので、アニメーターのWaitShotに設定しているアニメーションクリップにイベントを追加します。

アニメーションイベントを作成する

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

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

Unityで敵キャラが主人公に近づいた時に攻撃をしてくる機能
Unityで主人公が敵に近づいた時に敵が主人公を攻撃してくる機能を作成します

を参考にしてください。

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

終わりに

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

また前述したように骨のローカルの角度がX、Y、Zがともに0でないといろいろ大変な事になるのですが、最初に構え終わった後の骨のローカル角度を記憶しているので、他の0でない骨でも大丈夫です。

以前は骨のX、Y、Zがすべて0でないとうまく出来ていなかったのですが、ボーンの設定等の影響からX、Y、Zがすべて0というのは難しいと思ったので、初期の角度を取得してそこからの相対値で変更する方法に変えました。

また、horizontalとverticalだと直感的にどちらの事を指しているのかわかりづらかった為、xとyという単純な変数名に変更しました。以前のスクリプトだと骨の位置によっておかしくなっていました。

そこでSetPrepareShot関数内でinitX、initYの取得はせず、構え終わった時の最初の1回だけ骨の角度を取得するようにしました。
また以前はinitX、initY、lastX、lastYの値をint型で宣言していましたが、少数の細かい値を捨てていた為、floatに変更しました。

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

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