EventSystem 事件系统

这篇具有很好参考价值的文章主要介绍了EventSystem 事件系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

EventSystem 事件系统

事件系统在开发中必不可少事件系统使用观察者模式可以极大程度降低程序的耦合,之前的文章也讲过事件系统但是不够高效简洁,如何轻便高效优雅的实现一个事件呢?依然基于之前的AssemblyManager 程序集管理器和SingletonSystem 单例管理系统进行开发,主要原理也是根据反射去获取事件的接口使用反射进行实例化处理类,而非人工手动订阅事件。

1.IEvent

public interface IEvent
{
    Type GetEventType();
    void Invoke(object self);
}

2.EventHandler

public abstract class EventHandler<T> : IEvent where T : struct
{
    private readonly Type _selfType = typeof(T);
    public Type GetEventType()
    {
        return _selfType;
    }
    public abstract void Handler(T eventStruct);
    public void Invoke(object self)
    {
        try
        {
            Handler((T)self);
        }
        catch (Exception ex)
        {
            Debug.LogError($"{_selfType.Name} Error : {ex.Message}");
            return;
        }
    }
}

3.EventInfo

public sealed class EventInfo
{
    public readonly Type Type;
    public readonly IEvent Event;

    public EventInfo(Type type, IEvent @event)
    {
        Type = type;
        Event = @event;
    }
}

4.EventSystem

public class EventSystem : Singleton<EventSystem>
{
    private readonly OneToManyList<Type, IEvent> _events = new();
    private readonly OneToManyList<int, EventInfo> _assemblyEvents = new();
    protected override void Load(int assemblyName)
    {
        foreach (Type type in AssemblyManager.ForEach(assemblyName, typeof(IEvent)))
        {
            IEvent @event = (IEvent)Activator.CreateInstance(type);
            if (@event != null)
            {
                Type thisType = @event.GetEventType();
                _events.Add(thisType, @event);
                _assemblyEvents.Add(assemblyName, new EventInfo(thisType, @event));
            }
        }
    }

    protected override void UnLoad(int assemblyName)
    {
        if(_assemblyEvents.TryGetValue(assemblyName,out List<EventInfo> events))
        {
            foreach (EventInfo info in events)
            {
                _events.RemoveValue(info.Type, info.Event);
            }

            _assemblyEvents.RemoveByKey(assemblyName);
        }
    }

    public void Publish<TEventData>(TEventData eventData) where TEventData : struct
    {
        if (!_events.TryGetValue(eventData.GetType(), out List<IEvent> list))
            return;

        foreach (IEvent @event in list)
        {
            try
            {
                @event?.Invoke(eventData);
            }
            catch (Exception ex)
            {
                Debug.LogError(ex.Message);
                return;
            }
        }
    }

    public override void Dispose()
    {
        _events.Clear();
        _assemblyEvents.Clear();
        base.Dispose();
    }
}

这里的每个事件传递的参数可以使用引用池进行管理避免重复创建相同的对象消耗性能。文章来源地址https://www.toymoban.com/news/detail-702359.html

5.测试

public class Test : MonoBehaviour
{
    void Start()
    {
        SingletonSystem.Initialize();
        AssemblyManager.Initialize();
    }


    private void Update()
    {
        SingletonSystem.Update();

        if (Input.GetKeyDown(KeyCode.P))
        {
            EventSystem.Instance.Publish<AgeEvent>(new AgeEvent() { Age = 18 });
        }
    }
}

public struct AgeEvent
{
    public int Age;
}

public class AgeChangeHandler : EventHandler<AgeEvent>
{
    public override void Handler(AgeEvent eventStruct)
    {
        Debug.Log(eventStruct.Age);
    }
}

到了这里,关于EventSystem 事件系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(73)
  • DOTS Unity.Physics物理引擎碰撞事件处理

    最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们给大家分享和介绍一下这个物理引擎的碰撞事件处理以及核心相关概念。 Unity.Physics 物理引擎的主要流程与P ipeline   Unity.Physics物理引擎做仿真迭代计算的时候主要通过以下步骤来执行:   

    2024年01月18日
    浏览(48)
  • Hazel游戏引擎(008-009)事件系统

    文中若有代码、术语等错误,欢迎指正 此节目的 理清顺序和设计才能更好的编码 设计如图 声明 图是我自己缝合的,流程与大意没错,但是不符合软件工程对应图的规范。 大致是根据视频草稿图与大意画的 使用时序图简单表示 使用类图详细表示 在软件工程中,类图没有消

    2024年02月01日
    浏览(39)
  • Unity EventSystem的一些理解和使用

    Unity的EventSystem是用于处理用户输入和交互的系统。它是Unity UI系统的核心组件之一,可以用于捕捉和分发各种事件,例如点击、拖拽、按键、射线等。 常用的属性和方法有以下这些: 属性: current : 获取当前的EventSystem实例。 sendNavigationEvents : 一个布尔值,表示是否发送导航

    2024年04月16日
    浏览(32)
  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(72)
  • Unity UGUI2——Canvas与EventSystem

    ​ Canvas 的意思是画布,它是 UGUI 中所有 UI 元素能够被显示的根本,它主要负责渲染自己的所有 UI 子对象 ​ 如果 UI 控件对象不是 Canvas 的子对象,那么控件将不能被渲染 ​ 我们可以通过修改 Canvas 组件上的参数修改渲染方式 ​ 场景中允许有多个 Canvas 对象,可以分别管理

    2024年02月12日
    浏览(54)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(62)
  • Unity vs Godot :哪个游戏引擎更适合你?

    游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来,Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较,以期为开发者提供正确的选择建议。 Godot和Unity都有各自的优势,没有绝对的好坏之分。Godot开源免费,上手简单,更适合2D和小型游戏

    2024年01月23日
    浏览(94)
  • 30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月11日
    浏览(69)
  • Unity–UI框架-Canvas-EventSystem-Panel

    画布canvas是控制一组UI元素如何呈现的组件, 所有UI元素必须是画布的子项 ,场景中可以有多个画布,但是UI元素至少需要一个可用的画布canvas, 每个画布都有不同的渲染模式,渲染模式可以使用Render Mode进行设置, 1.Screen Space-Overlay 其中,第一种是最常见的渲染模式,也是

    2024年02月03日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包