公開日:2023/09/27  更新日:2023/09/27

Unityで弾を撃つ方法(3D)

 今回はUnityの3Dゲーム制作で弾を撃つ方法を紹介していく。

 前回までの記事↓
Unityのゲーム制作

 方法は色々あるが、今回はプレイヤーが技を出したらプレハブで作っておいた弾(炎)を撃ち出すようにしていく。

Unityで弾を撃つ方法(3D)

弾を撃つポーズを作る
弾が出現する場所を作る
弾を作る
スクリプト記述
目次にもどる

弾を撃つポーズを作る

 まずは弾を撃つポーズを作る。
 ここは今まで記事で紹介したのとほぼ同じ作業。ボタンを押したらキャラが何かしらのアニメーションをとるようにすれば何でもOKだ。やり方がわからない場合は以下を確認してほしい。
剣を振る方法
燃える剣の必殺技
 今回は炎を飛ばすので、自分は右クリックすると剣に炎をまとって突き出すアニメーションが出るようにした。
 メソッドを呼び出すイベントを作成し、AttackStart、Hit()、AttackEndを呼び出すようにする。AttackStartで炎を撃ち、Hit()で攻撃終了、AttackEndでは攻撃アニメーション終了処理を行うことを考慮してイベントをアニメーションのどこで発生させるか決めよう。

目次にもどる

弾が出現する場所を作る

 次に弾が出現する場所を作る。Cubeなどを作り、今回は名前をHoudaiとする。
 Houdaiを剣や銃といった武器の子要素とする。剣の刀身や銃口など弾を出現させたい位置にHoudaiを移動させる。


目次にもどる

弾を作る

 Houdaiの子要素としてCubeを作成し名前をHonooにしてRigidbodyのコンポーネントを装着。このHonooをトリガーにするためにBox Colliderコンポーネントのis Triggerにチェックをつける。この辺りの仕組みがわからない場合は以下の記事を確認してほしい。
ダメージ判定・処理

 Honooのゲームオブジェクト自体は見えなくするため、Mesh Rendererのチェックを外す。
 Honooのゲームオブジェクトが当たり判定となるので、よく考えて大きさを設定する。
 Honooの子要素としてパーティクルを追加。自分は以下のフリー素材の炎パーティクルを使用した(FX_Kandol_Pack/FX Fire Ⅱ/PrefabsのFX_Fire_ParticleSystem01.prefab)。

 炎のフリー素材(2023年8月現在はフリー)

 Honooのゲームオブジェクトの大きさにだいたい合うように炎パーティクルの大きさを変更する。

 Honooの子としてcenterというゲームオブジェクトも作っている。後述するが着弾時吹っ飛ばし処理に関わる(これについては必ずしも実装する必要はない)。centerは弾のすぐ後ろの位置に移動させておく。

 プロジェクトビューにPrefabフォルダを作成しその下にTamaフォルダを作成する(名前は自分のわかるように)。TamaフォルダにHonooをドラッグ&ドロップしてプレハブ化する。
 今Houdaiの子要素となっているHonooについては削除する。

目次にもどる

スクリプト記述

 炎をまとった剣を突き出すスクリプト(以前、剣振りなどで作ったのとほぼ同じスクリプト)に以下のように記述してプレイヤーのゲームオブジェクトにアタッチする(炎射撃部分のみ記述している)。
 シリアル化しているので、インスペクター欄でhonotobasuprefabに先ほど作成したHonooのプレハブを指定する。
 省略しているが、攻撃中でない時に右クリックを押した時にAttackパラメータに20が入るようにして、AnimatorcontrollerではAttackパラメータが20だと遷移して炎をまとった剣を突き出すアニメーションをはじめるように指定しておく(もちろん、どのキーで攻撃を始めるようにするかは自由)。
 アニメーションがはじまるとAttackStartが呼び出されAttackパラメータに20が入っていると炎射撃処理が行われる。
 HonooプレハブをHoudaiの位置に実体化させて、AddforceのImpulseで力をかけて前方に飛ばしている。

 Honooプレハブに以下のスクリプトを記述しアタッチしておく(ほとんど以前の記事で作成したPlayerAttackと同じ)。

 重要なのは以下の部分。
 プレハブではヒエラルキー欄のゲームオブジェクトをSerializeFieldとして指定することができない。しかしプレイヤーのゲームオブジェクトは取得したい。
 よって、プレイヤーにアタッチした炎をまとった剣を突き出すスクリプトのAttackStartで以上のattackcharatuika(GameObject playerObject)のメソッドを呼び出すようにしている。
 送られたきたプレイヤーのゲームオブジェクトを引数から取得してAttackCharaに代入して保存。また、プレハブでの攻撃処理だと区別するためにkorehaprefabをtrueにしている。
 そして、プレハブでの攻撃処理の場合、着弾したら消えるようにするので、最後に以下のように記述している。
 今回は詳しく紹介しないが、吹っ飛ばし処理についても記述している。
 プレイヤーの攻撃位置と敵の位置から単位ベクトルを出し着弾した敵が吹っ飛ばす方向を決めている。
 プレイヤーが格闘攻撃をする場合にはこのままで問題ないが、プレハブでの飛び道具で攻撃する場合には飛び道具の位置と敵の位置で計算するようにしている(centerprefabには先述した子ゲームオブジェクトcenterを指定している。 centerを弾の後ろの位置にしておけば着弾した際も、弾が飛んできた方向とは逆に吹っ飛ばしを発生させられる)。

 ダメージ処理については敵に以下のスクリプトをアタッチしておく。

 以上のように記述すれば炎を飛ばして敵に当てダメージを与える処理が可能(着弾時に敵に炎が出る処理については紹介していない。今後機会があれば紹介する)。



 続きの記事は以下。
足音をつける

Unityのゲーム制作まとめへ戻る

page top