【Unity】Unityでファサードデザインパターンを当てはめてみる

Unityでは、ファサード(Facade)パターンを使用して複雑なシステムを簡素化することができます。ファサードパターンは、外部のクライアントがシステムの内部構造や複雑なサブシステムの詳細について知る必要なく、単純なインターフェースを通じてシステムとやり取りすることを可能にします。

Unityにおけるファサードパターンの具体的な例としては、ゲームオブジェクトやコンポーネントの管理、リソースのロード、シーン遷移などがあります。これらのタスクは、Unityエンジン内部で複雑な手順を必要とする場合がありますが、ファサードパターンを使用することで、これらのタスクを単純なインターフェースで処理することができます

サンプル

// ファサードクラス
public class GameManager : MonoBehaviour
{
    // メインのゲームマネージャーとしての機能を提供する単一のインスタンス
    private static GameManager instance;

    // サブシステムクラスのインスタンス
    private PlayerManager playerManager;
    private AudioManager audioManager;

    // 初期化処理
    private void Awake()
    {
        // インスタンスの作成
        if (instance == null)
            instance = this;
        else
            Destroy(gameObject);

        // サブシステムの初期化
        playerManager = GetComponent<PlayerManager>();
        audioManager = GetComponent<AudioManager>();
    }

    // ゲームの開始処理
    public void StartGame()
    {
        playerManager.SpawnPlayer();
        audioManager.PlayBackgroundMusic();
    }

    // ゲームの終了処理
    public void EndGame()
    {
        playerManager.DespawnPlayer();
        audioManager.StopBackgroundMusic();
    }

    // ファサードパターンを使用する外部のクライアントは、GameManagerのインスタンスを通じてシステムとやり取りする
    public static GameManager Instance
    {
        get { return instance; }
    }
}

上記の例では、GameManagerクラスがファサードクラスとなります。GameManagerはゲームの開始や終了などの主要な機能を提供し、内部でPlayerManagerAudioManagerなどのサブシステムを管理しています。外部のクライアントは、GameManager.Instanceを介してゲームの開始や終了などの操作を行うことができます。

ファサードパターンを使用することで、ゲーム開発者は複雑なシステムをシンプルに操作でき、クライアントのコードもより簡潔になります

使い方

上記のコードを使ったサンプルを以下に示します

using UnityEngine;

public class GameStarter : MonoBehaviour
{
    private void Start()
    {
        // ゲームマネージャーのインスタンスを取得
        GameManager gameManager = GameManager.Instance;

        // ゲームの開始
        gameManager.StartGame();

        // 5秒後にゲームの終了
        Invoke("EndGame", 5f);
    }

    private void EndGame()
    {
        // ゲームマネージャーのインスタンスを取得
        GameManager gameManager = GameManager.Instance;

        // ゲームの終了
        gameManager.EndGame();
    }
}

このサンプルでは、GameStarterクラスを使ってゲームを開始し、一定時間経過後に終了する処理を行っています。GameStarterクラスはMonoBehaviourを継承しており、Start()メソッドでゲームの開始と終了を制御しています。

Start()メソッド内では、まずGameManager.Instanceを使ってゲームマネージャーのインスタンスを取得します。その後、gameManager.StartGame()を呼び出してゲームを開始します。そして、Invoke()メソッドを使って5秒後にEndGame()メソッドを呼び出し、ゲームを終了します。

EndGame()メソッド内でも同様にGameManager.Instanceを使ってゲームマネージャーのインスタンスを取得し、gameManager.EndGame()を呼び出してゲームを終了します。

このように、ファサードパターンを使うことで、外部のクライアントは単純なインターフェース(GameManager.Instance)を通じてゲームの開始と終了を操作することができます