Unity框架-Mono管理器

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

一、前言

在Unity开发中,经常会遇到需要在没有继承MonoBehaviour的类中使用协程和Update的情况。为了解决这个问题,我们可以使用Mono管理器,该管理器允许非MonoBehaviour类使用一些常用的Mono方法。在本篇文章中,我们将深入探讨Mono管理器的实现以及如何使用它进行协程管理和Update事件的监听。

二、Mono管理器的结构

Mono管理器分为执行者类和管理类。

执行者类:

MonoController类是Mono管理器内部的执行者类,它的主要作用是处理非MonoBehaviour类的更新事件的触发和监听器的管理。具体来说,它充当了一个桥梁。

主要职责:

  1. 更新事件的触发:

    MonoController中包含了UpdateFixedUpdateLateUpdate等生命周期事件的实现。

         当这些事件被触发时,它会调用相应的监听器,执行注册在这些事件上的方法。

    2.监听器管理:

         MonoController维护了三个事件类型的监听器,分别用于UpdateFixedUpdate和  LateUpdate。

         提供了添加、移除以及移除所有监听器的方法,以便外部能够动态地注册和取消注册这些事件。  

管理类:

MonoManager是一个管理类,其主要作用是提供一种机制,使那些没有继承MonoBehaviour的类也能够方便地利用Unity的生命周期事件和协程。

主要职责:

  1. 协程管理:

       MonoManager通过MonoController类提供了协程的管理功能,允许非MonoBehaviour的类通过StartCoroutineStopCoroutineStopAllCoroutines方法来开启、停止和停止所有协程。
  2. 更新事件管理:

            提供对Update、FixedUpdate和LateUpdate事件的监听器管理,允许非MonoBehaviour的类通过AddUpdateListenerAddFixedUpdateListenerAddLateUpdateListener等方法添加相应事件的监听器。同时,提供了移除特定监听器和移除所有监听器的方法。
  3. 单例模式:

            MonoManager通过继承NoMonoSingleton类实现了单例模式,确保在整个项目中只有一个MonoManager的实例。
两者关系:
  1. 主从关系:

    • MonoManager 是主类,负责对外提供协程管理和更新事件管理的接口。
    • MonoController 是辅助类,被 MonoManager 内部使用,负责实际执行协程和触发更新事件。
  2. 协作方式:

    • MonoManager 中包含了一个私有成员变量 _monoController,该变量是 MonoController 类的一个实例。
    • MonoManager 通过 monoController 属性来获取或创建 _monoController 实例,以便在其中执行协程和触发更新事件。
  3. 功能分工:

    • MonoManager 主要负责对外提供协程管理和更新事件管理的方法,以及实现单例模式。
    • MonoController 主要负责实际的协程管理和更新事件的触发,同时作为一个内部类,使得这些功能可以被非 MonoBehaviour 的类调用。
  4. 解耦和灵活性:

    • 通过将协程和更新事件的具体实现封装在 MonoController 中,MonoManager 实现了对这些功能的解耦。这意味着,如果将来需要更改协程或更新事件的实现方式,只需修改 MonoController 而不影响 MonoManager 接口。

三、代码实现:

using System;
using System.Collections;
using Mr.Le.Utility.Singleton;
using UnityEngine;
using UnityEngine.Events;

namespace Mr.Le.Utility.Manager
{
    /// <summary>
    /// Mono管理器
    /// </summary>
    public class MonoManager : NoMonoSingleton<MonoManager>
    {
        private MonoManager()
        {
        } //防止外部实例化

        private MonoController _monoController;

        private MonoController monoController
        {
            get
            {
                if (_monoController == null)
                {
                    GameObject go = new GameObject(typeof(MonoController).Name);
                    _monoController = go.AddComponent<MonoController>();
                }

                return _monoController;
            }
        }

        #region 协程管理

        /// <summary>
        /// 让外部通过它来开启协程
        /// </summary>
        /// <param name="coroutine"></param>
        /// <returns></returns>
        public Coroutine StartCoroutine(IEnumerator coroutine)
        {
            return monoController.StartCoroutine(coroutine);
        }

        /// <summary>
        /// 让外部通过它来停止协程
        /// </summary>
        /// <param name="coroutine"></param>
        public void StopCoroutine(Coroutine coroutine)
        {
            monoController.StopCoroutine(coroutine);
        }

        /// <summary>
        /// 让外部通过它来停止所有协程
        /// </summary>
        public void StopAllCoroutines()
        {
            monoController.StopAllCoroutines();
        }

        #endregion

        #region Update事件管理

        /// <summary>
        /// 添加Update事件
        /// </summary>
        /// <param name="call"></param>
        public void AddUpdateListener(UnityAction call)
        {
            monoController.AddUpdateListener(call);
        }

        /// <summary>
        /// 移除指定Update事件
        /// </summary>
        /// <param name="call"></param>
        public void RemoveUpdateListener(UnityAction call)
        {
            monoController.RemoveUpdateListener(call);
        }

        /// <summary>
        /// 移除所有Update事件
        /// </summary>
        public void RemoveAllUpdateListeners()
        {
            monoController.RemoveAllUpdateListeners();
        }

        #endregion

        #region FixedUpdate事件管理

        /// <summary>
        /// 添加FixedUpdate事件
        /// </summary>
        /// <param name="call"></param>
        public void AddFixedUpdateListener(UnityAction call)
        {
            monoController.AddFixedUpdateListener(call);
        }

        /// <summary>
        /// 移除指定FixedUpdate事件
        /// </summary>
        /// <param name="call"></param>
        public void RemoveFixedUpdateListener(UnityAction call)
        {
            monoController.RemoveFixedUpdateListener(call);
        }

        /// <summary>
        /// 移除所有FixedUpdate事件
        /// </summary>
        public void RemoveAllFixedUpdateListeners()
        {
            monoController.RemoveAllFixedUpdateListeners();
        }

        #endregion

        #region LateUpdate事件管理

        /// <summary>
        /// 添加LateUpdate事件
        /// </summary>
        /// <param name="call"></param>
        public void AddLateUpdateListener(UnityAction call)
        {
            monoController.AddLateUpdateListener(call);
        }

        /// <summary>
        /// 移除指定LateUpdate事件
        /// </summary>
        /// <param name="call"></param>
        public void RemoveLateUpdateListener(UnityAction call)
        {
            monoController.RemoveLateUpdateListener(call);
        }

        /// <summary>
        /// 移除所有LateUpdate事件
        /// </summary>
        public void RemoveAllLateUpdateListeners()
        {
            monoController.RemoveAllLateUpdateListeners();
        }

        #endregion

        /// <summary>
        /// 执行者类
        /// </summary>
        public class MonoController : MonoBehaviour
        {
            private event UnityAction updateEvent;
            private event UnityAction fixedUpdateEvent;
            private event UnityAction lateUpdateEvent;

            private void Update()
            {
                updateEvent?.Invoke();
            }

            private void FixedUpdate()
            {
                fixedUpdateEvent?.Invoke();
            }

            private void LateUpdate()
            {
                lateUpdateEvent?.Invoke();
            }

            #region Update中的事件管理

            public void AddUpdateListener(UnityAction call)
            {
                updateEvent += call;
            }

            public void RemoveUpdateListener(UnityAction call)
            {
                updateEvent -= call;
            }

            public void RemoveAllUpdateListeners()
            {
                updateEvent = null;
            }

            #endregion

            #region FixedUpdate中的事件管理

            public void AddFixedUpdateListener(UnityAction call)
            {
                fixedUpdateEvent += call;
            }

            public void RemoveFixedUpdateListener(UnityAction call)
            {
                fixedUpdateEvent -= call;
            }

            public void RemoveAllFixedUpdateListeners()
            {
                fixedUpdateEvent = null;
            }

            #endregion

            #region LateUpdate中的事件管理

            public void AddLateUpdateListener(UnityAction call)
            {
                lateUpdateEvent += call;
            }

            public void RemoveLateUpdateListener(UnityAction call)
            {
                lateUpdateEvent -= call;
            }

            public void RemoveAllLateUpdateListeners()
            {
                lateUpdateEvent = null;
            }

            #endregion
        }
    }
}

 四、总结

       通过使用Mono管理器,我们可以在非MonoBehaviour类中方便地使用协程和更新事件,提高代码的灵活性和可复用性。希望本篇博客能够帮助你更好地理解和使用Mono管理器,提升Unity开发的效率。文章来源地址https://www.toymoban.com/news/detail-808930.html

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

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

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

相关文章

  • 【Unity 框架】QFramework v1.0 使用指南 架构篇:03. 引入 Command | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏

    【Unity 框架】QFramework v1.0 使用指南 架构篇:03. 引入 Command | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏

    我们回顾一下目前的代码,如下; 现在,数据共享的问题通过 引入 Model 解决了。 这里再次强调一下,需要共享的数据放 Model 里,不需要共享的,能不放就不放。 虽然引入了 Model,但是这套代码随着项目规模的发展还是有很多的问题。 其中最严重也最常见的就是 Controller

    2024年02月06日
    浏览(13)
  • 【Unity 框架】QFramework v1.0 使用指南 工具篇:13. 其他事件工具 | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏

    QFramework 除了支持了 TypeEventSystem、EasyEvent 还支持了 EnumEventSystem、StringEventSystem。 EnumEventSystem 前身是 老版本 QFramework 的 QEventSystem StringEventSystem 的前身是,老版本的 MsgDispatcher TypeEventSystem: 事件体定义简洁 比较适合用于设计框架 支持 struct 获得较好内存性能 使用反射,CPU

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

    使用团结引擎开发Unity 3D射击游戏

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

    2024年01月19日
    浏览(48)
  • Unity、UE、Cocos游戏开发引擎的区别

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

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

    Unity vs Godot :哪个游戏引擎更适合你?

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

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

    30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

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

    2024年02月11日
    浏览(66)
  • Unity Physics2D 2d物理引擎游戏 笔记

    Unity Physics2D 2d物理引擎游戏 笔记

    2d 材质 里面可以设置 摩擦力 和 弹力 Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产生的GameObject,而取消勾选Simulated只是禁用。 Kinematic 动力学刚体 动力学刚体不受重力和力的影响,而受用户的

    2023年04月24日
    浏览(43)
  • GODOT游戏引擎简介,包含与unity性能对比测试,以及选型建议

    GODOT游戏引擎简介,包含与unity性能对比测试,以及选型建议

    GODOT,是一个免费开源的3D引擎。本文以unity作对比,简述两者区别和选型建议。由于是很久以前写的ppt,技术原因视频和部分章节丢失了。建议当做业务参考。 GODOT目前为止遇到3个比较重大的机遇,第一个是oprea的合作奖,第二个是用支持c#换来的微软的投资,第三个是虚幻

    2024年02月14日
    浏览(112)
  • Unity和UE4两大游戏引擎,你该如何选择?

    Unity和UE4两大游戏引擎,你该如何选择?

    目录 游戏引擎 2 —— 难易区别 编程语言 3 —— 游戏产品 UE4制作的游戏产品  Unity制作的游戏产品  产品类型 5 —— 资源商店 6 —— 人才需求 平均薪资 总结      Unity和UE4都是游戏引擎,所谓游戏引擎就是集成了复杂功能的游戏开发软件,他们帮我们实现了复杂的底层逻

    2023年04月08日
    浏览(50)
  • Unity 开发人员转CGE(castle Game engine)城堡游戏引擎指导手册

    Unity 开发人员转CGE(castle Game engine)城堡游戏引擎指导手册

    一、简介 2. Unity相当于什么GameObject? 3. 如何设计一个由多种资产、生物等组成的关卡? 4. 在哪里放置特定角色的代码(例如生物、物品)?Unity 中“向 GameObject 添加 MonoBehaviour”相当于什么? 5.Unity子目录相当于什么Assets? 6. 支持哪些模型格式? 7. 支持FBX模型格式吗? 8.

    2024年02月07日
    浏览(17)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包