[Unity]VRで使えるそれっぽい銃を作りたい~レーザー編~

laser_icatch Particle

前回Instantiateを使って弾を生成する方式の銃を作りました。今回はそれを少しだけ改変して、他のパターンであるレーザータイプの銃を作っていきます。

基本的な仕組み

illustlaserSys02前回同様Colliderで「握られている」状態を検知しトリガーが引かれた際に発射のメソッドを呼び出します。このとき、レーザーの現れる位置を銃口付近に設定し、レーザーマズルフラッシュの表現をそれぞれLineRendererコンポーネント、ParticleSystemコンポーネントで行いました。(ParticleSystemとLineRendererはそれが追加されているオブジェクトだけでしか呼び出せないので、銃口部分とグリップ部分でスクリプトを分けました)

※レーザーの再現にあたって【Unity】ParticleとLineRendererで○めはめ波を作ろう!、及びUnity5でVR開発シューティングゲームが作りたくて2レーザービーム発射を参考にさせていただきました。

オブジェクトの追加

銃のモデリング自体はアセットのHandgunを利用しています。銃モデルをシーン上に追加し、その銃口付近に銃モデルの子要素として空のオブジェクトを作成します。muzbeam

コンポーネントの追加

銃のグリップ部分にBoxCollider及びRigidbody、OVRGrabbableスクリプトを追加します。この辺りのやり方は過去の記事を見てみてください。次に銃口側にParticleSystem、LineRendererコンポーネント追加します。これらのパラメータは以下のようにしました。

ParticleSystemの設定

particleCom色々項目が多いのですが、大体Start LifetimeStart SpeedStart SizeStart Colorを上のように設定すればそれっぽくなると思います。またLoopingPlayOnAwake項目のチェックは予め外しておきます。今回ParticleSystemをマズルフラッシュとして利用しましたが、他にも炎などの流体エフェクトを生み出したい場合に利用することができます。

LineRendererの設定

このコンポーネントは3次元空間上で二つの座標からマテリアルを伸ばして直線を描きます。そのため座標マテリアルを設定する必要があるのですが、座標自体はスクリプトから取ってくるので、ここではマテリアルのみ設定します。ちなみに描画する直線の幅はLineRendererコンポーネントのwidthから設定できます(今回は0.02ぐらいにしました)。

mate01

マテリアルをプロジェクト上で作ります。上のようにShaderParticles/AdditiveTint ColorをParticleSystemのように設定すれば完了です。また今回テクスチャは必要なかったので設定しませんでした。

スクリプトの追加

グリップ側のスクリプト

前回と同様に「握られている」際に発射するメソッドを呼び出すのですが、今回はその方法としてSendMessage関数を用いました。これは第一引数にメソッド名、第二引数にメソッドに与える値が入ります。この関数の場合、メソッドはクラスではなくオブジェクト自体から取ってくる必要があったので、最初に”Beam”といったPublicのオブジェクトを宣言し、コンポーネントに後で追加しました。綺麗な書き方ではないのですが、第二引数は特に使わないのでこの値でなくても大丈夫です。※他スクリプトからメソッドを取ってくる他の方法だと何故か解決できないNullReferenceエラーに苦しめられたので、この方法を採用しました。

銃口側のスクリプト

発射するメソッドが呼び出された際に、ParticleSystem及びLineRendererコンポーネントをオンにしています。この時LineRendererの開始座標を銃口にするためtransform.positionに設定しました。またRayという目に見えない光線を出す関数を用いてLineRendererの収束地点を検出するために、Ray.origin、Ray.directionつまりRayの開始地点と進行方向を銃口のオブジェクトの値にします。

RaycastHitというRayの当たったオブジェクトを検出する関数を用いることで、今回では”shootable”というようなレイヤー設定がされたオブジェクトに当たった際に、LineRendererの収束地点をその当たった座標にしました。

demolasershoot

コメント

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