【Unity】Unityでメディエイターデザインパターンを当てはめてみる

Unityエンジンは、ゲーム開発やアプリケーション開発に使用される人気のあるゲームエンジンです。メディエーターパターンは、ソフトウェア設計のパターンの1つであり、複数のオブジェクト間の相互作用を仲介する役割を果たす中央のオブジェクト(メディエーター)を使用します。

Unityでメディエーターパターンを実装する場合、通常は以下の手順に従います。

  1. メディエータークラスの作成: Unityのスクリプトで、メディエーターとして機能するクラスを作成します。このクラスは、関連するオブジェクト間の通信を仲介する責任を持ちます。
  2. オブジェクトの登録: 各オブジェクトは、メディエーターに登録されます。これにより、メディエーターは登録されたオブジェクトを追跡し、相互作用を管理できるようになります。
  3. メッセージの送信: オブジェクトは、メディエーターにメッセージを送信することで相互作用を要求します。メッセージには必要な情報が含まれており、メディエーターはそれを解釈し、関連するオブジェクトに適切なアクションを実行させます。
  4. メディエーターの応答: メディエーターは、受け取ったメッセージに基づいて関連するオブジェクトに応答します。これにより、オブジェクト間の相互作用が制御され、調整されます。

メディエーターパターンは、Unityでゲームオブジェクト間の相互作用やイベントの処理を管理する際に便利です。例えば、複数のキャラクターがある場合、メディエーターパターンを使用してキャラクター間の通信を仲介し、コラボレーションやイベントの制御を行うことができます。

ただし、Unityにはメディエーターパターンを直接サポートする組み込み機能はありません。したがって、実装する場合は自分でパターンを実装する必要があります。

サンプル

以下は、Unityにおける簡単なメディエーターパターンのサンプル実装です。

using System.Collections.Generic;
using UnityEngine;

// メディエータークラス
public class Mediator : MonoBehaviour
{
    private List<Colleague> colleagues = new List<Colleague>();

    // オブジェクトの登録
    public void RegisterColleague(Colleague colleague)
    {
        if (!colleagues.Contains(colleague))
        {
            colleagues.Add(colleague);
        }
    }

    // メッセージの送信
    public void SendMessage(Colleague sender, string message)
    {
        foreach (Colleague colleague in colleagues)
        {
            if (colleague != sender)
            {
                colleague.ReceiveMessage(message);
            }
        }
    }
}

// オブジェクトの基底クラス
public class Colleague : MonoBehaviour
{
    protected Mediator mediator;

    // メディエーターへの登録
    public void SetMediator(Mediator mediator)
    {
        this.mediator = mediator;
        mediator.RegisterColleague(this);
    }

    // メッセージの送信
    public void SendMessage(string message)
    {
        mediator.SendMessage(this, message);
    }

    // メッセージの受信
    public virtual void ReceiveMessage(string message)
    {
        // メッセージの処理
    }
}

// 具体的なオブジェクトクラス
public class Player : Colleague
{
    public void Attack()
    {
        // 攻撃処理
        SendMessage("Player attacked!");
    }

    public override void ReceiveMessage(string message)
    {
        Debug.Log("Player received message: " + message);
    }
}

public class Enemy : Colleague
{
    public void TakeDamage()
    {
        // ダメージ処理
        SendMessage("Enemy took damage!");
    }

    public override void ReceiveMessage(string message)
    {
        Debug.Log("Enemy received message: " + message);
    }
}

// 使用例
public class Example : MonoBehaviour
{
    private Mediator mediator;

    private void Start()
    {
        mediator = GetComponent<Mediator>();

        Player player = new Player();
        Enemy enemy = new Enemy();

        player.SetMediator(mediator);
        enemy.SetMediator(mediator);
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Player player = FindObjectOfType<Player>();
            player.Attack();
        }

        if (Input.GetKeyDown(KeyCode.Return))
        {
            Enemy enemy = FindObjectOfType<Enemy>();
            enemy.TakeDamage();
        }
    }
}

このサンプルでは、Mediatorがメディエータークラスとなり、Colleagueがオブジェクトの基底クラスです。PlayerEnemyは具体的なオブジェクトクラスで、ReceiveMessageメソッドでメッセージを受信します。Exampleクラスでは、PlayerEnemyの作成とMediatorへの登録、そしてメッセージの送信が行われます。

実行すると、Spaceキーを押すとPlayerが攻撃し、Returnキーを押すとEnemyがダメージを受けます