こんにちは。学部3年の山田です。
今回はUnityで壁とかに弾痕を残すやつをいろんなサイトをコピペ参考にしながら作ったので紹介します。
今回使用したAssetとモデル紹介
使わせていただいた銃の3Dモデル かっこいい
製作者:GHOST EMPIRE様
BOOTH↓ booth.pm
アニメーション作成に使ったAsset↓
血のエフェクト↓
Rayを使う
弾痕を残すやつを作るうえでどんな実装方法にするか考えてみた結果、まず”弾が当たった場所に弾痕の画像を置く”という機能を作れば良いと思い調べたところUnityのRayという機能が引っかかり、実装している先駆者様もいました。
Rayの主な使い方は当たり判定を飛ばしてcolliderにぶつけて何かするというものです。今回は銃の先端からRayを飛ばし、壁にぶつかったらその座標を取得し、取得した座標に弾痕を置く、という実装方法になっています。
実装
早速ですが下記サイトにある記事を参考にして銃の先端からRayを飛ばし、オブジェクトと接触した座標に弾痕を表示させるものを作ります。
こちらで紹介されているものはカメラの中心からRayを飛ばして画像をオブジェクトの表面に表示させるものです。このままカメラオブジェクトを銃の子として銃の先端に配置するだけでもいいですが、必要なものはRayの初期位置と方向なので他のオブジェクトでも代用できます。
デバッグ用にRayを可視化してあります。Rayとオブジェクトが接触した座標に弾痕が表示されています。
あとはボタンを押したら壁に弾痕が現れるような処理を追加するだけです。下記サイトを参考に弾痕を配置する処理を追加します。配置する座標と角度は上記サイトを参考にしました。
これで銃口からRayを飛ばして、当たった場所に弾痕を配置させることができるようになりました。
あとはキャラクターに持たせるなりカメラの子にするなりすればそれっぽいものは作れます。
今回はUnityChanに持たせてみました。
無事、壁に弾痕が残るのを確認できました。
おまけ 人と壁を区別できるようにする
Raycastの要素の中にRaycastHitというものがあります。これはRayが当たったオブジェクトの情報を読み取ることができ、今回もオブジェクトにRayが当たった場所などの情報を読み取っています。RaycastHitで読み取ることができる情報の中に、オブジェクトのレイヤー情報があります。これを使って人と壁を区別します。
人として扱うオブジェクトのレイヤー番号を8、壁として扱うオブジェクトのレイヤーをDefault(番号0)とします。 下記サイトを参考に、レイヤー番号が0なら弾痕を、レイヤー番号が8なら血のパーティクルを配置するようにします。
実装した結果↓
人(豆腐)を撃った時には血が出ます。 終