Unity_Lesson

イベントは、C#におけるデリゲートの特別な使用法で、オブジェクトの状態が変わったことを他のオブジェクトに通知するための仕組みです。イベントは、特にオブジェクト指向プログラミングやGUIアプリケーションにおいて重要な役割を果たします。

イベントの主な特徴

  1. デリゲートとの関係: イベントは、デリゲートを使って定義され、特定のデリゲート型を持つメソッドのリストを保持します。

  2. 公開・非公開の制御: イベントは、外部から直接デリゲートを操作するのではなく、専用のメソッド(通常は+=-=)を通じてメソッドを追加したり削除したりします。これにより、データのカプセル化が維持されます。

  3. 発行者と購読者の分離: イベントを使用すると、発行者(イベントを通知する側)と購読者(通知を受け取る側)を疎結合に保つことができ、コードの可読性と保守性が向上します。

イベントの定義と使用方法

イベントの定義

以下の例では、GameEventというデリゲート型を定義し、それを使用してイベントOnGameStartを作成します。

using System;

public delegate void GameEvent(); // デリゲートの定義

public class Game
{
    public event GameEvent OnGameStart; // イベントの定義

    public void StartGame()
    {
        Console.WriteLine("Game is starting...");
        OnGameStart?.Invoke(); // イベントを発火
    }
}

イベントの購読と発行

次に、イベントを購読して通知を受け取る方法を示します。

public class GameListener
{
    public void Subscribe(Game game)
    {
        game.OnGameStart += HandleGameStart; // イベントを購読
    }

    private void HandleGameStart()
    {
        Console.WriteLine("Game has started!"); // イベントが発火した際に実行されるメソッド
    }
}

使用例

実際にゲームを開始して、イベントが発火する例を示します。

public class Program
{
    public static void Main()
    {
        Game game = new Game();
        GameListener listener = new GameListener();
        
        listener.Subscribe(game); // リスナーをサブスクライブ
        game.StartGame(); // ゲームを開始
    }
}

Unityにおけるイベントの使用

Unityでもイベントは広く使われており、特にゲームの状態やユーザーの入力に応じたアクションの通知に便利です。

Unityでのイベントの例

以下は、Unityでのイベントの使用例です。

using UnityEngine;

public class Player : MonoBehaviour
{
    public delegate void PlayerEvent();
    public event PlayerEvent OnPlayerDeath;

    public void Die()
    {
        Debug.Log("Player died.");
        OnPlayerDeath?.Invoke(); // プレイヤーが死んだときにイベントを発火
    }
}

public class GameManager : MonoBehaviour
{
    public Player player;

    void Start()
    {
        player.OnPlayerDeath += HandlePlayerDeath; // イベントを購読
    }

    private void HandlePlayerDeath()
    {
        Debug.Log("Handling player death in GameManager.");
        // プレイヤーの死亡に応じた処理をここに記述
    }
}

まとめ

イベントを使用することで、アプリケーションのフローを効果的に制御し、ユーザーのアクションに対して反応することが容易になります。