イベントのフロー

// 1. イベントセンサー
public class EventSensor : MonoBehaviour
{
    public EventCommunicator eventCommunicator;

    void OnTriggerEnter(Collider other)
    {
        // プレイヤーがオブジェクトに接触した場合
        if (other.CompareTag("Player"))
        {
            // EventCommunicator に通知
            eventCommunicator.Notify(EventType.ShopEvent);
        }
    }
}

// 2. イベントコミュニケーター(MonoBehaviour継承しない)
public class EventCommunicator
{
    private EventManager eventManager;

    public EventCommunicator(EventManager manager)
    {
        eventManager = manager;
    }

    public void Notify(EventType eventType)
    {
        // イベントマネージャーに通知
        eventManager.NotifyEvent(eventType);
    }
}

// 3. イベントマネージャー(MonoBehaviour継承しない)
public class EventManager
{
    public ShopEventManager shopEventManager;
    public TreasureChestEventManager treasureChestEventManager;
    public NPCDialogueEventManager npcDialogueEventManager;
    public EarthquakeEventManager earthquakeEventManager;

    public void NotifyEvent(EventType eventType)
    {
        switch (eventType)
        {
            case EventType.ShopEvent:
                shopEventManager.HandleEvent();
                break;
            case EventType.TreasureChestEvent:
                treasureChestEventManager.HandleEvent();
                break;
            case EventType.NPCDialogueEvent:
                npcDialogueEventManager.HandleEvent();
                break;
            case EventType.EarthquakeEvent:
                earthquakeEventManager.HandleEvent();
                break;
        }
    }
}

// 4. 各種イベントマネージャー(MonoBehaviour継承しない)
public class ShopEventManager
{
    public void HandleEvent()
    {
        // ショップのロジックを実装
        Debug.Log("Shop event triggered.");
    }
}

public class TreasureChestEventManager
{
    public void HandleEvent()
    {
        // 宝箱を開けるロジックを実装
        Debug.Log("Treasure chest event triggered.");
    }
}

public class NPCDialogueEventManager
{
    public void HandleEvent()
    {
        // NPCとの会話のロジックを実装
        Debug.Log("NPC dialogue event triggered.");
    }
}

public class EarthquakeEventManager
{
    public void HandleEvent()
    {
        // 地震のロジックを実装
        Debug.Log("Earthquake event triggered.");
    }
}

// イベントタイプを列挙
public enum EventType
{
    ShopEvent,
    TreasureChestEvent,
    NPCDialogueEvent,
    EarthquakeEvent
}