i-school - 銃口の向きと弾の先端を一致させる発射機能の実装例
 FPS ゲームや TPS ゲームを制作する際、弾の形状が丸型ではない場合、銃の発射口の向きと弾の先端とを一致させる必要があります。


<確認動画 ー発射口の向きと弾の先端の方向が一致しているー>
動画ファイルへのリンク




ゲームオブジェクトの構成


 あくまでもサンプルの構成ですので、自分のプロジェクトの内容に合わせて変更して利用してください。

 ヒエラルキーで Create Empty を行い、Player 用のゲームオブジェクトを作成します。
その子オブジェクトとして、コライダーを持つ Body オブジェクトと、銃のゲームオブジェクトを配置します。

 Body ゲームオブジェクトも Create Empty で作成して、Capsule Collider をアタッチしておきます。
コライダーのサイズはゲームの環境に合わせて、プレイヤーの当たり判定として利用することを前提に設定してください。

 銃のゲームオブジェクトについては、アセットストアなどからインポートしたものを利用してください。


Player ゲームオブジェクト



Body ゲームオブジェクト(コライダー用)



Body ゲームオブジェクト(コライダー用)


 ゲームオブジェクトを作成するときに、親子関係がある場合、それぞれの位置が大切になります。
子オブジェクトを作成したら、まずは (0,0,0) の位置に合わせてから、調整を行うようにしましょう。



 そのあと、同じく Player の子オブジェクトとして、Muzzle ゲームオブジェクトを配置します。
この Muzzle ゲームオブジェクトは発射口を示すためのものですので、先ほどの銃のゲームオブジェクトに対して
銃口の位置になるように位置を調整してください。


ヒエラルキー画像(子オブジェクトの並び順は順不同です)



Muzzle ゲームオブジェクトの位置調整



弾のゲームオブジェクトと発射口の確認


 弾の状態を確認する部分から行います。

 銃の銃口の回転方向を (0,0,0) になっているか、確認してください。
その状態で、弾のプレハブをヒエラルキーに配置してください。
弾のサイズが小さいと確認しにくいため、適宜なサイズに調整をおこなってください。





 このとき、弾と銃の銃口が同じ方向を向いているか、確認を行います。
一致していれば問題ありませんが、下記の画像のように弾の向きがずれていることがあります。


 


 このケースの場合、弾の X 軸が 90 度ずれています。
つまり、弾が生成されたとき、常に銃口から 90 度ずれていることを考慮して、スクリプトの修正を行う必要があります。








 例えば、銃口が (90,30,30) という方向に対して向いているとしたら、
この向きだけを弾に与えた場合、先ほどシーンに配置したときのように 90 度 ずれて、その向きを向きます。
 よって、スクリプトの修正内容としては、

1.弾の向きを銃口に合わせる
2.弾の向きのうち、X 軸を 90 度、追加で回転させる

 この2つの処理を行うことで、弾が銃口に合うようになります。

ここでのポイントは、スクリプトだけを見直すのではなくて、そもそも、銃口に対して、弾がどうなっているのかを
事前に自分でチェックしておく必要がある、という部分です。

なぜなら、事前に配置することで、弾が銃口に対してずれていることを確認できますし、
その前提があって始めて、スクリプトの修正案を検討することができるためです。
スクリプトの制御によって「どのような形にしたいのか」をイメージすることが出来るようになります。

 スクリプトだけを見直していた場合、この弾の回転については修正が出来ません。

このように、処理を修正する場合には、スクリプトのみではなくて、Unity 全体で考えて見直していくという考え方、
視点を持つことが大切です。

なお、今回はたまたま銃口に対して 90 度のずれがありましたが、これが毎回決まって 90 度ということでもありません。
・回転させたいものが、どのような状態になっているか
それを元にして、柔軟な対応をするための、広い視野を持つことも大切です。


<サンプルコード>


 BulletGenerator をスクリプトし、Muzzle ゲームオブジェクトにアタッチします。


BulletGenerator.cs

<= クリックすると開きます。



インスペクター画像



動作を確認する


 ゲームを実行して動作を確認しましょう。

 漠然と動かすのではなく、自分が作成したスクリプトの内容を確認し、処理が正常に動作しているかを見極める力をつけていってください。


<確認動画 ー発射口の向きと弾の先端の方向が一致しているー>
動画ファイルへのリンク

 上手く動かない場合には、Unity 内の設定や、スクリプトの内容を見直してください。


<応用 ー処理のメソッド化ー>


 BulletGenerator スクリプトの Update メソッド内に書いてある内容をブロック化して、弾の生成と発射までの部分をメソッド化してみましょう。

 また、メソッド化したら、メソッド名の上にサマリーを書いておくようにしましょう。
どのような処理を行っているか、すぐに判断ができます。


 下記はサンプルコードですが、まずは、一人でチャレンジしてみてください。

BulletGenerator.cs

<= クリックすると開きます。