Unityに関連する記事です

 2Dゲームにおいて、一度に複数の弾の発射機能を作成した際のユースケースです。

 特にこのケースは、一度に複数発射する弾の先端を、異なる発射方向と一致させる際に必要な機能になります。

 例えば、プレイヤーの前方2方向や3方向に弾を発射する場合、弾を扇状に発射するタイプが多いと思いますが、
弾の方向設定と回転設定の処理をしっかりと行わないと、すべて同じ位置に弾が発射されることになってしまいます。

 また、複数の弾を発射する場合、弾の形状が丸型以外であってもプレイヤーの向きと弾の先端方向とを一致していないと、画面表示がちぐはぐになります。

 イメージとしては、弾を矢に置き換えてで考えたとき、矢じりの向きがプレイヤーの向いている方向と一致する形にすることが目的です。

 どういった処理を施す必要があるのかを理解しておくことで、問題を解決する能力を養うことができますし、学習することで他の弾の発射処理にも応用が出来るようになります。

 この記事では、複数の弾を扇状に発射する処理を学習しながら、正しい方向設定の方法も学習しましょう。


<扇状 3方向>



<扇状 4方向>



<確認動画 ープレイヤーの向きと弾の先端方向が一致しているー>
動画ファイルへのリンク




事前準備


 この教材ではこちらの記事の内容をベースに作成しています。

   => 【2D】一度に複数発射する弾の先端を、異なる発射方向と一致させる機能の実装例


<応用 ー処理を戻り値付のメソッド化にするー>


 BulletGenerator スクリプトの PrepareGenerateBullet メソッド内に書いてある内容を1つのブロックして捉え、弾の生成と発射までの部分をメソッド化してみましょう。
このとき、処理の結果を得ることができるように、メソッドには戻り値を設定しましょう。

 また、メソッドを自作したら、メソッド名の上にサマリーを書いておくようにしてください。
どのような処理を行っているか、すぐに判断ができます。
メソッド名は原則、「動詞+名詞」になるようにつけるとよいでしょう。


 下記はサンプルコードですが、まずは、一人でチャレンジしてみてください。

BulletGenerator.cs

<= クリックすると開きます。



複数の弾を発射する


 それでは BulletGenerator スクリプト内に、2つ以上の弾を発射する場合の機能を追加します。
先ほどメソッド化した機能を活用します。


BulletGenerator.cs

<= クリックすると開きます。



ゲームを実行して動作を確認する


 新しく追加した機能が実行されるか、デバッグをして確認してください。
 

<扇状 3方向>



<扇状 4方向>



 いままでの弾を発射する機能も正常に動いていることも合わせて確認してください。


<発展 ーswitch 文による分岐処理を一元化するー>


 現在の処理では、弾の数を元にして switch 文による分岐処理を行って発射方向を計算しています。

 問題なく動作していますが、仮に、弾の数を増やしていくことになると、さらに分岐処理を追加していく必要があり、弾が増えるほど管理保守が大変になります。

 そのため、この switch 文による分岐処理についてリファクタリングを行い、計算式を作成して処理の一元化を図ります。

 どういうことかというと、弾の数に合わせて、どの位置に配置するかを自動計算する仕組みを作ります。
分岐の代わりに自動計算させることで、弾の数に応じた処理を自動化させます。

 この方法のメリットは switch 文による分岐処理が必要なくなることです。
そして弾の数が増えていっても、分岐処理を追加したり、修正する必要がなくなります。

 管理や保守が楽になりますし、弾の数も自由に設定できます。なぜなら、弾の数により、発射する方向が自動化してあるためです。

 まずは自分の作った分岐の処理が、1つの計算式としてまとめられないかを考えてみましょう。
そして処理の一元化が可能である場合、処理の自動化を行うことにより、switch 文による長い分岐処理を作らなくて済むようになります。

BulletGenerator.cs

<= クリックすると開きます。



<メソッドのオーバーロード>


 今回はメソッドの引数について、メソッドのオーバーロード機能を利用しています。
これは同名のメソッドを作成し、引数の情報を異なる情報にしているメソッドやコンストラクタの事です。


<元からあるメソッド>
    private Vector2 CalculateBulletDirection(int count, Vector2 direction)

<元からあるメソッドと同名の新しいメソッド>
    private Vector2 CalculateBulletDirection(float offsetAngle, Vector2 direction)

 第1引数の型がそれぞれ異なっています。

 このときプログラムは、引数の情報に応じて、どちらの同名メソッドを利用するのかを自動的に判別して実行してくれます

 今回は第1引数の型を変更していますが、引数の数を変える場合にもオーバーロードが使えます。


参考サイト
++C++; // 未確認飛行 C 様
雑記 オーバーロード解決


ゲームを実行して動作を確認する


 分岐の処理を、自動計算の処理に置き換えました。
内部的な処理の効率化(リファクタリング)を行っているだけなので、ゲーム画面での処理はいままでと変わりません。


<扇状 3方向>



<扇状 4方向>



 同じように動作することを確認してください。



 以上になります。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます