Unityでジェネリクスを実装する方法

目的

戦闘時に呼び出すダメージ処理に関わる関数がEnemyクラスとPlayerクラスで別れている。

それを、ダメージ処理は共通の処理を書いているのでジェネリクスを使って1つにまとめたい。

現状詳細

EnemyControllerクラスとPlayerControllerクラスにそれぞれダメージ処理を書いている。

改善方法

戦闘で発生する処理を担当するBattleSystemクラスを作成し、そこにまとめる。

ジェネリクスについて

※C#だとジェネリクスとは言わずに、ジェネリックと呼ぶらしい。

参考資料

ジェネリック メソッド (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, Deffencer>(Attacker attacker, Deffencer deffencer)
    where Attacker : BattleInterface
    where Deffencer : BattleInterface
    {
        int deffencerHP = deffencer.HP;
        deffencerHP -= 10; // ダメージ
        if (deffencerHP < 0) deffencerHP = 0;

        deffencer.HP = deffencerHP;
    }
}

その他に気になった記事

interface (C# リファレンス)

C#

Posted by admin