銃を撃った時に空薬莢を飛ばす機能をUnityで作成する

今回は銃を撃った時に薬莢を飛ばしてみます。

銃には詳しくないので、どのあたりから薬莢が出てきて、どこへ飛んでいくのかわかりませんが、種類によっても違うみたいです。

詳しく調べてから機能を作成しろよ!

と自分自身に言い聞かせながらてきとうなわたくしはそのまま機能作成に突入するのであった・・・・(謎)

とりあえず、撃ったら薬莢が飛んでいく銃という事に限定しましょう(^_^;)

スポンサーリンク

弾の設定と銃に薬莢を飛ばす場所を作成する

bullet11

上のような弾丸の3Dオブジェクトを用意します。


bullet10

弾丸オブジェクトをシーン上に配置し、弾の大きさの調整をし、AddComponentでRigidbodyをつけます。
銃を撃った時に薬莢に力を加えて飛ばす為です。Use Gravityにチェックを入れ重力も働くようにしておきます。

弾にBox Colliderをつけて薬莢が地面の上に散らばるようにします。
衝突判定として使うのでIs Triggerのチェックは外しておきます。
設定が終わったらAssetsエリアにドラッグ&ドロップしプレハブ化します。シーン上の弾は削除してかまいません。

これで薬莢の準備が出来ました。

次は銃に薬莢が出てくる場所を設定します。
銃のプレハブをシーン上に配置し、bulletPositionという名前で空薬莢が出てくる位置を作成します。
bulletPositionという名前は変えてください・・・・。

bullet12

座標をLocalに変更(重要)し、空薬莢が出ていく方向(青色のZ方向)を調整します。
今回は銃の右後ろ側に調整してください。

bullet13

上のような感じに調整が出来たら、銃のインスペクタでApplyを押し修正をプレハブに反映させます。
反映させたら修正用の銃は消してください。

銃から空薬莢を飛ばすスクリプトをShotスクリプトに追加

それでは銃を撃った時に空薬莢を飛ばすスクリプトを作成します。
今までの記事をご覧いただいた方はShotスクリプトを修正します。
そうでない方は銃を撃った時の処理を行うスクリプトを変更してください。

bulletには薬莢のプレハブ、bulletPositionには銃のbulletPositionをインスペクタ上で設定します。

銃を撃った時の処理JudgeShot関数内に空薬莢の処理を追加します。

Instantiateでプレハブからインスタンスを作成し、位置と角度をそれぞれ指定しておきます。
空薬莢の発生位置はbulletPositionの位置、角度はデフォルトの角度にしておきます。

次に空薬莢に設定されているRigidbodyを取得し、AddForceで指定の向きと強さで力を加えます。
向きはbulletPositionのZ方向の向きを指定したいので、bulletPosition.forwardとします。
これでbulletPositionのZ方向の向きを取得することが出来ます。

向きを取得したら、どれだけの力を加えるかを指定します。
今回は多少ランダム値を加える為に、Random.Rangeを使っています。

int型の数値を二つ指定すれば、1番目の引数から2番目に指定した数字の前までの値をランダムに取得出来ます。
float型で指定した場合は2番目の引数の値も含めます。

空薬莢は飛んだあと地面と衝突するように指定していますが、空薬莢のインスタンスが増えるとやっかいなので、弾はDestroy(bullet, 3)を使って3秒後に消しています。

秒数を指定せずDestroy(bullet)とした場合は即座に消えます。
即座に消えると空薬莢が出現と同時に消えるので意味がありませんが・・・。

これで銃を撃った時に空薬莢を飛ばす処理は完成しました。
Unityの実行ボタンを押して確認してみましょう。

bullet14

上のように空薬莢が右後ろに飛んで行くようになりました。

空薬莢に回転を加える

--以降追記--

空薬莢が飛んでいく方向にランダムな力を加えていましたが、飛んでいく力を同じにする方が自然な感じがします。
そこで空薬莢に回転を加えます。

Rigidbodyに回転を加えるにはAddTorqueを使います。

X、Y、Z軸方向をランダムに設定し回転させます。第2引数にForceMode.Forceを指定すると、継続的に回転させます。

早くて回転があまりかかっていませんが、もっとランダムに飛ばしたい場合は、Instantiateした時に
角度をランダムに設定すればかなりランダムになります。(ランダムランダムガンダム・・・・)

リアルではなくなりますが・・・。