i-school - おはじきゲーム 手順16
 以下の内容で順番に実装を進めていきます。

手順16 ー的球と障害物との接触処理を実装ー
29.障害物(的球)用スクリプトを修正する(的球が接触した際に1回で消える処理を追加する) 
30.的球用スクリプトを修正し、的球ゲームオブジェクトをプレファブにする



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

・baseキーワードによる親クラスのメソッドへのアクセス



29.障害物用スクリプトを修正する(的球が接触した際に1回で消える処理を追加する)

設計


 プレイヤーである手球が障害物に接触した場合には手球の残数が減少するようにしています。そのためデメリットとなる処理です。
的球の場合には逆にプレイヤーにとってメリットとなる処理を実装し、的球を弾く際の目標物として利用してもらえるようにします。

 障害物である穴に的球が接触した場合には、体力に関係なく、1回で破壊されるようにします。
これは穴の障害物のみの処理ですので、親クラスではなく、子クラスである Obstacle_Hole クラスを修正して、穴ゲームオブジェクト独自の処理としていきます。

 このように子クラスによって振る舞いを変えることが出来るのが、クラスを継承した場合の利点の1つです。


Obstacle_Holeクラスを修正する


 親クラスのメソッドである OnCollisionEnter2Dメソッドをオーバーライドして利用し、子クラス独自の処理を追加します。
オーバーライドする際には、親クラスのメソッドの内容をすべて上書きするか、あるいは利用するかを選択できますので、
今回は親クラスの処理を利用しつつ、子クラスに専用の処理を合わせて追記していきます。


Obstacle_Hole.cs

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



<baseキーワードによる親クラスのメソッドへのアクセス>


 base キーワードは、子クラス内から親クラスのメンバーにアクセスするために使います。
 子クラスのメソッドにおいてオーバーライドを行う場合に、親クラスに記述されているメソッドの内容を参照し、それを子クラスで利用したい場合には以下の書式を用います。

 base.オーバーライドするメソッド名(引数);


 今回のケースでは、親クラスで実装しているOnCollisionEnter2Dメソッドの内容に加えて、子クラスではさらに追加の処理を記述する、という形式になっています。
オーバーライドする際にはこのように、親クラスの処理を使うのか、あるいは使わないのかを選択することが出来ます。

 base.キーワードを使用する場合には、処理の順番にも気を付けてください。
子クラスで実装したい処理よりも上に書けば、最初にbaseの処理(親クラスで実装している処理)が実行されますし
子クラスで実装する処理よりも下に書けば、子クラスの処理の後に親クラスで実装している処理が実行されます。


 子クラス内で base.OnCollisionEnter2D(col); を実装していますので、記述は1行ですが、実際には以下の親クラスで実装している処理が実装されていることになります。

baseで参照しているメソッドの内容
  protected virtual void OnCollisionEnter2D(Collision2D col)
    {
        if (col.gameObject.tag == "Liner")
        {
            return;
        }

        if (col.gameObject.tag == "CharaBall")
        {
            if (col.gameObject.TryGetComponent(out CharaBall charaBall))
            {
                BeforeTriggerEffect(charaBall);

                Sequence sequence = DOTween.Sequence();

                sequence.Append(charaBall.transform.DOLocalRotate(new Vector3(0, 0, 720), 0.5f, RotateMode.FastBeyond360).SetEase(Ease.Linear));

                AfterTriggerEffect(charaBall);
            }
        }
    }


参照サイト
MicroSoft C# リファレンス
base キーワード
https://docs.microsoft.com/ja-jp/dotnet/csharp/lan...


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


 ゲームを実行して、的球を弾いて障害物に接触させてみてください。1回の接触で的球が破壊されれば成功です。


実行動画 障害物に的球が接触すると破壊される
https://gyazo.com/37d2d0610e1ef1d08b207f8b74a82ab4


30.的球用スクリプトを修正し、的球ゲームオブジェクトをプレファブにする

設計


 次の手順において、BattleManagerクラスに処理を追加し、ゲームの実行と同時に自動的にEnemyBallゲームオブジェクトを生成するようにします。
ここではその準備として、EnemyBall クラスを修正後、EnemyBall ゲームオブジェクトをプレファブにしておきます。


EnemyBallクラスを修正する


 新しい変数を2つ、新しいメソッドを1つ追加します。どちらの変数も、新しく作成するメソッドを通じて取得します。

 DestroyEmenyメソッドに新しい処理を追加します。そのほかの部分には追加・修正はありません。



EnemyBall.cs

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



EnemyBallゲームオブジェクトをプレファブにする


 EnemyBallスクリプトの修正が終わりましたので、ヒエラルキーにある EnemyBall ゲームオブジェクトをプレファブにします。
プレファブ後はヒエラルキーにある EnemyBall ゲームオブジェクトは削除してください。


EnemyBallゲームオブジェクト インスペクター画像



Open Prefab画像




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