前書き
今回は遠距離武器の「弾薬の作り方」について紹介していこうと思います。弾薬の場合は
- モデルの作成
- ダメージや速度などの機能の実装
- Feedbacksの実装
- 軌跡やぶつかった時のパーティクルの実装
を行うことが多いです。最小限の実装としてはモデルとダメージなどの機能を実装すれば問題なく使えるため武器を作るよりも難易度は下がるかなと思います。とはいえ、遠距離武器がどのように弾薬を呼び出しているのかを理解しないと作りもよくわからないため遠距離武器の作りを見てから弾薬を作ることをお勧めします。
遠距離武器の作り方については第2回で簡単に紹介した記事もあるので遠距離武器の作り方が分からない場合はこちらも参考にご確認ください。
では、前回同様にDemoの中から「弾薬」の作りを見ていきましょう。今回はDemoにある「MinimalSandbox2D」の中から以下の「黄色い武器(以下、KoalaGunAmmoBased)」に設定される弾薬について見ていきたいと思います。
KoalaGunAmmoBasedに設定される弾薬について
KoalaGunAmmoBasedのオブジェクトの中を見るとMMSimpleObjectPoolerコンポーネントがあります。その中にある「Game Object To Pool」に設定されている「KoalaGunBullet」が遠距離武器ごとに設定される弾薬になっています。
ここで注意してほしいことはTopDown Engineの場合、武器に設定できる弾薬は一つだけがデフォルトとなっています。そのため、Aという武器に対してはA’の弾薬を設定することはできますが、B’やC’といった違う武器の弾薬を設定することは(現状)できないと思います。そのため今回の弾薬の作り方については、一つに武器に対応した弾薬であること、を前提として説明していこうと思います。
KoalaGunBulletの作り
KoalaGunBulletは以下のような作りになっています。
- KoalaGunBullet
- SmokeTrail
- GunBullet
- BulletImpact
- HitDamageableFeedback
- HitNoDamageableFeedback
それぞれのオブジェクトについて簡単に説明していきたいと思います。
KoalaGunBullet
KoalaGunBulletの機能を司るオブジェクトになります。このオブジェクトに「DamageOnTouch」や「BoxCollider2D」などのプレイヤーや敵に当たった時に発生するダメージなど弾薬としての機能を持たせたコンポーネントを設定します。
SmokeTrail
弾が発射された時の軌跡を発生させるパーティクルを設定します。
GunBullet
弾のモデルを設定します。
BulletImpact
弾がプレイヤーや敵に当たっときのパーティクルを設定します。
HitDamageableFeedback
弾が当たった時のダメージが発生する場合のFeedbackを設定します。
HitDamageableFeedback
弾が当たった時のダメージが発生しない場合のFeedbackを設定します。
KoalaGunBulletの中のうち弾薬としての機能が設定されたコンポーネントなどがあるオブジェクトはKoalaGunBulletオブジェクトになります。KoalaGunBulletに設定されているコンポーネントについてさらに詳しく見ていきましょう
KoalaGunBulletに設定されているコンポーネントについて
KoalaGunBulletには以下のコンポーネントが設定されています。それぞれが弾薬としての機能を持たせるためのコンポーネントになっていますが、必須となるコンポーネントと必須ではないコンポーネントがありそれぞれ簡単に説明していきたいと思います。
#弾薬としての機能が必要なものを必須と記載しています。そのため、極端な例でいえばDamageOntouchはなくてもエラーなく実行できますが、ダメージが発生しない弾薬になってしまうため今回の説明では必須と記載しています。
- MMPoolableObject(任意)
- Health(任意)
- DamageOnTouch(必須)
- MMPreventPassingThrough2D(任意)
- BoxCollider2D(必須)
- Rigdbody2D(必須)
- BouncyProjectile(必須)
MMPoolableObject(任意)
「MMPoolableObject」は遠距離武器からMMSimpleObjectPoolerコンポーネントで呼ばれるために必要なコンポーネントとなっています。MMPoolableObjectコンポーネントを使うことでオブジェクトをDestoryすることなくActhive/NonActiveで使用できるため処理が軽くなります。
基本的に「MMPoolableObject」と「MMSimpleObjectPooler」は組となって使われるイメージであればいいかと思います。
またパラメータにLife Timeがあるため一定以上の時間が経ったらNonActiveにすることも可能です。
・・・っとなっていますが、後ほど紹介する「Projectile」コンポーネントが「MMPoolableObject」を拡張したクラスになっています。そのため、Projectileコンポーネントを設定すればMMPoolableObjectコンポーネントがなくても問題ない作りになっています。そのため、ここで設定するMMPoolableObjectコンポーネントは正直なくてもいいかなと思い、任意になっています。
Health(任意)
「Health」コンポーネントについては任意のコンポーネントになります。Healthコンポーネントの有無で変わる効果として以下のことが考えられます。
- Healthコンポーネントを使用する場合
→壁やプレイヤーなどに当たった場合、自分自身にダメージを発生させ、Healthを”0″にすることでHealthが”0″になったときのFeedbackなどを設定することが可能です。 - Healthコンポーネントを使用しない場合
→壁やプレイヤーなどに当たった場合でも、Healthが”0″にならないため、常に存在し続けることが可能です。(MMPoolableObjectのLifeTimeがすぎない限り画面上に存在し続けると思います)
「壁に当たっても弾薬は存在し続けたい」、「壁に当たったら弾薬は非活性にしたい」などあると思いますので必要であれば適宜設定するのがいいかと思います。
DamageOnTouch(必須)
プレイヤーや敵に当たった時にダメージを発生させるために必須のコンポーネントになっています。またHealthコンポーネントでも説明しましたが、「壁やプレイヤーなどに当たった場合、自分自身にダメージを発生させる」(Damage Taken)を設定させるためにも必要なコンポーネントになっています。
MMPreventPassingThrough2D(任意)
高速で移動するオブジェクトがコライダーを通過しないようになるコンポーネントになります。弾速が早くなるとどうしてもコライダーの判定を通過してしまうことが多いのでこのコンポーネントを設定することで通過を防ぐことができます。そのため、このコンポーネントがなくても弾薬としての機能は動くため任意のコンポーネントになります。
BoxCollider2D/Rigdbody2D(必須)
BoxCollider2DとRigdbody2Dについては説明不要で必須のコンポーネントになります。
Projectile(必須)
弾薬としての必須のコンポーネントになります。(画像上は「BouncyProjectile」が記載されていますが「BouncyProjectile」はバウンド機能が付与された拡張クラスになり、根底クラス「Projectile」が必須コンポーネントになります。)
Projectileコンポーネントが弾速や弾のモデルの向きなどを設定します。また、ProjectileコンポーネントはMMPoolableObjectを拡張したクラスになっているため、MMPoolableObjectで設定する内容もここで設定することができます。LifeTimeで設定した時間を超えた場合、非活性になります。
新しく弾薬を作りたい場合、何からやればいい?
新しく弾薬を作りたい場合の最低限の設定になります。
- Projectile(必須コンポーネント)
→LifeTime、弾薬の速度、モデルの向きなど基本的なパラメータを設定する - 弾薬のモデルを設定する
最低限上記を作成した弾薬を遠距離武器に設定することで、とりあえずの動きを見ることができると思います。弾薬についてはパーティクルやモデルの変更など機能としてよりは見た目などを変えてみてオリジナル要素を出す必要があるかなと思います。
まとめ
今回は遠距離武器の作り方~弾薬の作り方~について紹介しました。
弾薬については設定する項目がそこまでないため比較的難易度は簡単かなと思います。ただし、機能としては簡単ですが、Trailの設定や弾が当たった時の設定、見た目の変更など、オリジナル要素を出したい場合は機能よりも見た目をいろいろ変える必要があるためその部分が大変かなと思います。
第2回、第3回で最低限の遠距離武器の使い方が分かったかと思います。ただし、第2回、第3回ではプレイヤーの初期装備が遠距離武器の場合にのみ攻撃ができる状態です。フィールド上にあるアイテムを拾うための設定などを次回紹介していこうと思います。
コメント