i-school - 3Dレールガンシューティング 手順4
 プレイヤーの攻撃処理を3回の手順に分けて、実装します。
この手順ではプレイヤーの情報を管理するためのクラスを作成していきます。

手順4 ープレイヤーの情報を管理する機能の実装ー



 ・ラムダ式によるプロパティの記述方法
 ・【 a = b = 条件式】 の書式



1.設計


 プレイヤー側の操作周りの実装を行います。新しく3つのクラスを作成していきます。
クラス名はこの通りである必要はありません。その場合、クラスの役割に合った名前にしてください。

<今回実装するクラス> 
 ◇ PlayerController   プレイヤーの情報を管理するクラス。体力や弾数などを管理し、外部のクラスに情報提供するクラス。リロード処理、敵の攻撃の当たり判定なども管理する
             カメラのゲームオブジェクト(AR Camera、あるいは Main Camera ゲームオブジェクト)にアタッチする

 ・ EffectManager エフェクトの管理を行うクラス。Create Empty で新しいゲームオブジェクトを作成し、そこにアタッチする
             シングルトンで作成し、どのクラスからでもアクセスしやすい状態にする。エフェクトなどは個別のゲームオブジェクトに持たせないようにし、管理を簡便化できる

 ・ RayController     画面のタップ処理(マウスの左クリック)を判定し、Physics.Raycast メソッドを活用して、弾が発射できるかを管理制御するクラス
             PlayerController から弾数の情報を提供してもらい、PlayerController の弾数の値を更新したり、リロードさせる命令をだす
             カメラの子オブジェクトとして Create Empty で新しいゲームオブジェクトを作成し、そこにアタッチする
       


<完成時のヒエラルキー画像>


 これらがすべて完成することにより、プレイヤーの攻撃の処理が実装されます。

 イベント側(敵やアイテムなど)の実装がまだ済んでいないため、その手前までを Debug.Log メソッドを活用して実装し、
それらの実装が終了してから、再度修正を加えて完成に近づけていくようにします。


2.イベント用のゲームオブジェクトの作成を行う

プレイヤーの攻撃を判定するためのゲームオブジェクトを作成します。


仮のゲームオブジェクトを作成していただくか、実際に実装するゲームオブジェクトで対応するかは任意です。


仮のゲームオブジェクトであれば、3D Object => Cube などを作成して、それらで判定を行います。
ゾンビのアセットを利用するのであれば、以下のリンクより取得できます。

アセットストア/Zombie
https://assetstore.unity.com/packages/3d/character...





攻撃の判定処理には Physics クラスの Raycast メソッドを活用します。
これは Ray と Layer を組み合わせて判定を行いますので、イベント用のゲームオブジェクトに Layer の設定を行います。


新しく Enemy の Layer を追加し、それを、イベント用のゲームオブジェクトにも設定してください。
下記の参考画像では複数の Layer が登録されていますが、必要なものだけ登録すれば問題ありません。


Layer




以上で事前の準備は完了です。


3.PlayerController クラスを作成する



プレイヤーの情報を管理するための PlayerController クラスを作成します。
変数(プロパティ) を利用して体力や弾数などを管理し、外部のクラスに情報提供します。


メソッドとしては、クラスの設定処理、体力や弾数の更新処理、リロード処理、敵からの攻撃の当たり判定なども準備しておきます。


今回のケースでは、カメラ = プレイヤーの構図でゲームを作成しますので、このスクリプトはカメラのゲームオブジェクトにアタッチし、
カメラがプレイヤーとしての役割も合わせもつ形になります。


PlayerController.cs

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



6.Main Camera ゲームオブジェクトに PlayerController クラスをアタッチする


 Main Camera ゲームオブジェクトの名称を変更しておいてもいいと思います。

 各種のインスペクターを下記の画像を参考にして設定してください。
数値は適宜調整をお願いします。


<インスペクター画像>


 以上で設定は完了です。


<応用> PlayerControler クラスをリファクタリングする

 プロパティや初期値の設定について、新しい記述の方式を用いてリファクタリングを行います。


PlayerController.cs

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



4.<ラムダ式によるプロパティの記述方法>

 ラムダ式による記述はプロパティについても利用することが出来ます。


<プロパティの書式の一例>
    public int BulletCount
{
    set {
        bulletCount = Mathf.Clamp(value, 0, maxBullet);
    }
    get {
        return bulletCount;
    }
}


<ラムダ式によるプロパティ>
    public int BulletCount
{
    set => bulletCount = Mathf.Clamp(value, 0, maxBullet);
    get => bulletCount;
}

get 部分については return を省略することが出来ます。

 注意点としては、プロパティでラムダ式にできるのは1行分だけ です。
そのため、例えば set 内に2行以上の処理がある場合にはラムダ式での記述はできません


5.<【 a = b = 条件式】 の書式>


 三項演算子を利用し、代入処理を2回行う書式です。

  // maxHp の設定値があるか(0 ではないか)確認。0 である場合、maxHp の初期値を 10 でセットしてから hp を設定
    hp = maxHp = maxHp == 0 ? 10 : maxHp;

 まずは最初に、一番右側の条件式の部分と、その結果の代入処理を行います。maxHp = maxHp == 0 ? 10 : maxHp の部分です。
条件式の部分は三項演算子になっていますので、maxHp の値が 0 であるかどうかを確認し、真であれば 10、偽であれば maxHp の値を maxHp に返します

 結果を受けて、hp = maxHp の処理を行います。つまり、三項演算子による結果が、maxHp と hp の両方に代入されることになります。
maxBullet 変数についても同様の処理に変更しています。

 通常の三項演算子の処理では比較してから適切な値を代入できますが、このように記述することで、値を更新した上で代入処理を行うことが出来ます。



 以上でこの手順は終了です。

 => 次は 手順5 ーエフェクト再生機能の実装ーです。