抽象クラスとして BulletBase クラスを作成し、IShootable インターフェースを実装します。
実装にあたり、Shoot メソッドを
抽象メソッドとして定義します。
抽象メソッドも、あくまでもメソッドを定義するのみで、振る舞いについてはサブクラスに委ねています。
通常のメソッドでインターフェースのメソッドを実装してしまうと、このクラス内での定義となり、サブクラスでの上書きが任意になってしまいますが、
抽象メソッドとして定義しておくことで、このクラスでは内部の実装をせず、サブクラスでの実装を強制することができます。
BulletBase.cs
<= クリックしたら開きます。
using UnityEngine;
public abstract class BulletBase : MonoBehaviour, IShootable
{
protected Rigidbody2D rb;
public Rigidbody2D Rb => rb; // get プロパティ
/// <summary>
/// 初期設定用の仮想メソッドです。
/// このメソッドをオーバーライドして、特定の型に基づいた初期設定を行うことができます。
/// </summary>
/// <param name="t">初期設定に使用するジェネリック型のパラメータです。メソッドの実行側で適切な型を指定します</param>
/// <typeparam name="T"></typeparam>
public virtual void SetUp<T>(T t) {
TryGetComponent(out rb);
}
/// <summary>
/// 弾を発射する操作を行うメソッドです。
/// 抽象メソッドとして IShootable インターフェースを実装しています。
/// 抽象メソッドであるため、このメソッドを子クラスでオーバーライドして、具体的な弾の発射挙動を実装します。
/// </summary>
/// <param name="direction">弾の発射方向を示す</param>
/// <param name="duration"> 弾の発射の持続時間を示す</param>
public abstract void Shoot(Vector2 direction, float duration);
}
インターフェースのメソッドを定義する順番に指定はありません。
例えば、Shoot メソッドの定義をしてから SetUp メソッドの定義を行うこともできます。
BulletBaseクラスは、アクションゲームにおける弾の制御の基盤となる親クラスです。
以下はその設計と実装についての説明です。