Unity EventSystemManager 事件管理系统

本文介绍了一个简单的Unity事件管理系统,该系统支持事件的注册、发送及移除。通过使用Dictionary存储事件,实现了基于事件名称的快速查找与操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经过多个版本的迭代,已经趋于成熟,可以通过ArrayList传递参数,只需注册和调用即可

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public struct MainEvent
{
    public MonoBehaviour host;
    public Action<ArrayList> action;
    public MainEvent(MonoBehaviour host, Action<ArrayList> action)
    {
        this.host = host;
        this.action = action;
    }
}

public class EventSystemManager
{
    private static EventSystemManager main;

    public static EventSystemManager Main
    {
        get
        {
            if (main == null)
            {
                main = new EventSystemManager();
            }

            return main;
        }
    }

    private Dictionary<string, List<MainEvent>> Event = new Dictionary<string, List<MainEvent>>();

    private Dictionary<string, List<MainEvent>> ReadyEvent = new Dictionary<string, List<MainEvent>>();

        AddReadyEvent();
        ClearNull();
        if (Event.ContainsKey(message))
        {
            foreach (MainEvent mainEvent in Event[message])
            {
                try
                {
                    mainEvent.action(value);
                }
                catch (Exception error)
                {
                    Debug.LogError("事件管理器消息:" + mainEvent.host.ToString().Split('(')[0] + "在调用" + message + "事件时出现错误。");
                    Debug.LogError(error);
                }
            }
        }

    void AddReadyEvent()
    {
        foreach(var mainEvent in ReadyEvent)
        {
            if (!Event.ContainsKey(mainEvent.Key))
            {
                Event.Add(mainEvent.Key, new List<MainEvent>());
            }
            foreach (var item in mainEvent.Value)
            {
                Event[mainEvent.Key].Add(item);
            }
        }
        ReadyEvent.Clear();
    }
    
    public void AddEvent(MonoBehaviour target, string eventName, Action<ArrayList> action)
    {
        ClearNull();
        if (!ReadyEvent.ContainsKey(eventName))
        {
            ReadyEvent.Add(eventName, new List<MainEvent>());
        }
        ReadyEvent[eventName].Add(new MainEvent(target, action));
    }

    public void AddEvent(MonoBehaviour target, string eventName, Action action)
    {
        ClearNull();
        Action<ArrayList> mainAction = al => { action(); };
        if (!ReadyEvent.ContainsKey(eventName))
        {
            ReadyEvent.Add(eventName, new List<MainEvent>());
        }
        ReadyEvent[eventName].Add(new MainEvent(target, mainAction));
    }

    void ClearNull()
    {
        Dictionary<string, List<MainEvent>> CopyEvent = Event.ToDictionary(key =>  key.Key , value => new List<MainEvent>(value.Value));
        foreach (var key in CopyEvent)
        {
            foreach (MainEvent mainEvent in CopyEvent[key.Key])
            {
                if (mainEvent.host == null)
                {
                    Event[key.Key].Remove(mainEvent);

                    if (Event[key.Key].Count == 0)
                    {
                        Event.Remove(key.Key);
                    }
                }
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值