Unityでジェネリクスを実装する方法
目的
戦闘時に呼び出すダメージ処理に関わる関数がEnemyクラスとPlayerクラスで別れている。
それを、ダメージ処理は共通の処理を書いているのでジェネリクスを使って1つにまとめたい。
現状詳細
EnemyControllerクラスとPlayerControllerクラスにそれぞれダメージ処理を書いている。
改善方法
戦闘で発生する処理を担当するBattleSystemクラスを作成し、そこにまとめる。
ジェネリクスについて
※C#だとジェネリクスとは言わずに、ジェネリックと呼ぶらしい。
参考資料
実装
1.3つのクラスと1つのインタフェイスを実装する。
・戦闘処理に関連する処理を担うBattleSystemクラス
・敵オブジェクトEnemyControllerクラス
・プレイヤーオブジェクトPlayerControllerクラス
・BattleSystemで引数にジェネリック型を指定した際に引数のメンバーを使うために必要なBattleInterfece
2.各クラスとインターフェイスの内容
PlayerControllerクラスとインターフェイス
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public interface BattleInterface
{
int HP { get; set;}
}
public class PlayerController : MonoBehaviour, BattleInterface
{
int hp;
public int HP { get => hp; set => hp = value; }
}
(ここでは簡易的にHPをPlayerControllerクラスのメンバーにしているが本当はMVCモデルに従って、Modelに帰属させる。)
EnemyController
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyController : MonoBehaviour, BattleInterface
{
int hp;
public int HP { get => hp; set => hp = value; }
}
BattleSystem
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class BattleSystem
{
public static void Damage<Attacker, Defencer>(Attacker attacker, Defencer defencer)
where Attacker : BattleInterface
where Defencer : BattleInterface
{
int deffencerHP = defencer.HP;
deffencerHP -= 10; // ダメージ
if (deffencerHP < 0) deffencerHP = 0;
defencer.HP = deffencerHP;
}
}
その他に気になった記事
ディスカッション
コメント一覧
まだ、コメントがありません