i-school - 2Dトップビューシューティング 手順15
 プレイヤーの進行方向に対して弾を発射する機能を実装します。
今回はタイルマップ上で実装していますが、通常の2Dシーンでも同様に機能します。

<実装動画>
動画ファイルへのリンク



 以下の内容で順番に実装を進めていきます。

 なお、この実装内には、プレイヤーの移動処理や移動方向と移動アニメーションの同期処理は含まれていません

手順15 ープレイヤーの向いている方向に弾を発射する機能ー
 ・弾のプレハブの作成
 ・Bullet スクリプトの作成
 ・BulletGenerator スクリプトの作成



 新しい学習内容は、以下の通りです。

 ・プロパティの省略記法



1.設計


 タイルマップに限らず、トップダウン型の2Dゲームであれば弾を発射する攻撃方法はよく見られる機能です。

 攻撃用のボタンを押した際に、プレイヤーの進行方向に対して弾を発射するようにします。
今回の実装においては、発射できる方向は8方向(上下左右・各斜め)ですが、この部分はもっとアナログな方向(360度)に変更可能です。

 また連射防止機能も用意します。一度発射したあとは一定時間が経過するまでは弾を再度発射できないように制御します。
ただし、時間については設定が可能な形にするので、0 にすることで、実質、連射可能にもできます。



 必要なオブジェクトとしては、弾用のゲームオブジェクトをプレハブとして用意します。

 必要なスクリプトとしては、弾のゲームオブジェクトを制御するためのコントローラーのスクリプト、
および、弾のプレハブを生成し、弾の発射命令をおこなうためのジェネレーターのスクリプトの2つです。


2.Bullet ゲームオブジェクトを作成する


 任意の画像、あるいはエフェクト(パーティクル)を使って、弾となるゲームオブジェクトを作成してください。
名前は Bullet にしてください。

 今回は Unity が用意している2Dの Circle ゲームオブジェクトを利用し、名前を変更しています。
その場合も画像を変更すれば弾として利用できます。


インスペクター画像



Sceneビュー画像



3.Bullet スクリプトを作成する


 Bullet ゲームオブジェクトを制御するためのコントローラーとなるスクリプトを作成します。
このスクリプトは Bullet ゲームオブジェクトにアタッチします。

 また、弾自体には速度や攻撃力といった情報はセットせず、外部のクラスから利用して使います
このような設計にしておくことで、弾そのものが情報を管理する必要がなくなるとともに、情報を固定化することを防ぐことが出来ます。

 つまり、この弾の速度はこの位、と一度決めてしまうと、その弾はその役割に固定されます。
そうではなく、弾ではあるものの、速度や攻撃力はその都度決めるようにする、としておくことで、汎用的に利用することが目的です。


Bullet.cs

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


 外部から実行してもらうための Shoot メソッドを用意しています。
引数で弾に必要な情報を受け取ることで、弾自体での各種の設定(弾の攻撃力、速度)は不要にしています。


4.<プロパティの省略記法>


 プロパティには複数の省略記法が用意されています。

 今回は、get のみを設定する場合に利用できる省略記法を採用しています。

    public int Damage => damage;  // プロパティ

 これは、下記の書式の省略記法です。

    public int Damage 
    {
        get
        {
            return damage;
        }
    } 

 get だけを設定したプロパティを用意する機会が多い(外部クラスには参照だけを許可する)ため、
自分で書くためだけではなく、他人の処理(ネットの記事や書籍など)を読み解くためにも役立ちますので、覚えておくと便利です。


5.Bullet ゲームオブジェクトに Bullet スクリプトをアタッチし、プレハブにする


 Bullet ゲームオブジェクトに作成した Bullet スクリプトをアタッチします。
特にインスペクターでの設定はありませんので、アタッチの確認を行ってから、プレハブにします。

 その後、ヒエラルキーにある Bullet ゲームオブジェクトは削除します。


インスペクター画像



6.BulletGenerator スクリプトを作成する


 プレハブにした Bullet ゲームオブジェクトを生成し、プレイヤーの進行方向の情報を渡して発射準備するためのジェネレーター用のスクリプトです。
このスクリプトはどのゲームオブジェクトにアタッチしても問題ありませんが、管理のしやすさから、今回はプレイヤー役のゲームオブジェクトにアタッチします。

 これはキー入力の情報をこのスクリプト内でも新しく取得しているため、プレイヤーの移動用のキー入力とは連動していないためです。
もしも連動した方がよいのであれば、スクリプトを見直して、処理を書き換えてみましょう。


BulletGenerator.cs

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


 プレイヤーの進行方向については、キー入力から取得しています。
その際、以前のキー入力情報を保持しておいて、進行方向が変更になったときだけ更新するようにしています。
そのため、停止している状態(キー入力がない状態)であっても、現在の進行方向に対して弾を発射できるようにしています。

 弾の発射には連射防止の機能を設けたいため、弾の発射処理部分をコルーチンメソッドとして処理しています。


7.プレイヤー役のゲームオブジェクトに BulletGenerator スクリプトをアタッチして設定を行う


 BulletGenerator スクリプトをアタッチして、インスペクターより設定を行います。

 プレハブをアサインし、他の値は適宜な数値を入力してください。初期値のままでも問題ありません。
 

インスペクター画像



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


 デバッグを行う際には、ソースコードの処理を読み解いていからゲームを実行してください。

 また、BulletGenerator スクリプトのインスペクターの値を調整しながら行いましょう。
弾の発射できなくなる時間の調整、弾の速度の調整など、ゲーム画面だけではなく、インスペクターも一緒に確認していきます。


<実装動画>
動画ファイルへのリンク



 以上で完成です。

  => 次は、手順16 ーー?です。