[Unity]VRで使えるそれっぽい銃をつくりたい

gun_shooting Instantiate

VRの大体のゲームはシューティングであるイメージが強かったので、”銃”を作ることができれば、何となく出来ることの幅が広がるのではないか、という素人っぽい安直な考えに至りました。

前提条件としてのVR環境セットアップは過去の記事「VRで使えるシンプルなフラッシュライト作成」にあります。

CGモデルの追加

今回はFreeで使うことのできるHandgunアセットを使用しました。

gunAsset

コンポーネントの追加

基本的に「掴める」「撃つ」機能の二つが作れれば銃として成立するので、まずは「掴める」機能から設定します。
インポートしたオブジェクトを早速シーン上に置いて、OVRGrabbableスクリプトBoxColliderRigidbodyの三つをコンポーネントとして追加します。(銃を握って打ちたいので、Colliderはグリップのみに設定しています。)

「撃つ」機能の追加

UnityではRayを用いるやり方など、銃を作る方法が多数ありますが、今回は作りやすさの点からInstantiate関数を使っています。また以下の方法はUnityでOculus Touchを使うメモ~銃を撃つ編~、及びUnity公式サイトのシューティング(シングルプレイヤー)を非常に参考にさせていただきました。

”銃口”の設定

Instantiate関数は指定したオブジェクトのコピーを生成します。この機能を利用して弾を作りたいので、弾の出現する位置を予め設定しておきます。

シーン上で空のオブジェクトを作って”Muzzle”といった名前に変更し、銃の子要素に設定します。muzzle_select

Muzzleは銃口に当たるような適当な位置にします。この時、弾の出る方向がZ軸(青矢印の方向)になるように調整する必要がありました。

view_muzzle

これで銃口が完成したので、あとはスクリプトで「撃つ」機能を作っていきます。また生成される弾自体は特に指定しないのでsphereのオブジェクトをプレファブとして置いておくだけにしました。

ソースコード

弾のスピードと弾自体を後からでも変更しやすいように、publicでbulletPrefab、bulletSpeedを宣言しています。

OnTriggerStay,Exit及びUpdate内の処理はfire関数を呼び出すこと以外、ほとんどフラッシュライト作成のスクリプトと同じです。

Fire関数ではまず最初にInstantiateコピーしたいオブジェクトの値位置角度を引数として与えて生成しています。生成したオブジェクトを”飛ばす”つまり、移動させる必要があるので生成したオブジェクトのRigidbody.velocityに、オブジェクトの方向(forward)にbulletSpeedを掛けた値を代入しています。

あとはこのスクリプトを銃に追加し、bulletPrefab、muzzle、bulletSpeedの項目をそれぞれ設定すれば、ひとまず撃てるようになりました。

demoshooting

とりあえずそれっぽくはなったのですが、何発かに一回正しくRigidbody.velocityが処理されない場合がありました。方針としてはfixedupdateらへんを使ってコードの修正ができればと考えています。

コメント

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