Unity常用模块_公共Mono类

公共Mono类

在Unity中,如果游戏运行时,游戏脚本中存在多个Update,这会造成一定的性能损耗,所以我们可以用一个公共Mono类来统一使用一个update。

当然公共Mono的另一个作用就是在一个类不继承Mono的前提下使用unity提供的脚本生命周期和协程。

公共Mono类在之后的一些模块中会经常用到,这里就先介绍公共Mono的代码书写。

公共Mono类

从本类可以看出,公共Mono的本质就是利用事件来使那些没有继承Mono的类使用unity的东西,当然只有这一个类的化,那这个类就没有那么神奇了。我们还需要一个单例管理类来保证全局只使用这一个Update等unity的方法

using UnityEngine;
using UnityEngine.Events;


/*
Editor:
Version:
The last time for modification:
Time for Creation:
*/
namespace CsharpBaseModule.PublicMono
{
    /// <summary>
    /// 公共Mono类,可以让所有脚本共用一个脚本生命周期
    /// </summary>
    public class PublicMono : MonoBehaviour
    {
        public event UnityAction UpdateEvent;
        private void Update()
        {
            if (UpdateEvent != null)
            {
                UpdateEvent();
            }
        }

        public void AddUpdateListener(UnityAction listener)
        {
            UpdateEvent += listener;
        }

        public void RemoveUpdateListener(UnityAction listener)
        {
            UpdateEvent -= listener;
        }
    }
}

MonoManager

using CsharpBaseModule.Singleton;
using UnityEngine;
using UnityEngine.Events;

namespace CsharpBaseModule.PublicMono
{
    //未继承Mono的类,通过MonoManager单例直接使用unity的方法。
    public class MonoManager : BaseSingleton<MonoManager>
    {
        //我们通过封装一个公共Mono类的对象来实现公共Mono类的作用。此对象用于在管理类的中的方法中调用unity方法。
        private PublicMono _mono;
		//这里的构造函数将由基础单例类中生成单例时调用。
        public MonoManager()
        {
            GameObject gameObject = new GameObject(typeof(MonoManager).ToString());
            gameObject.AddComponent<PublicMono>();
        }
        //添加回调函数,此函数将直接在PublicMono类中的Update中执行。
        public void AddUpdateListener(UnityAction listener)
        {
            _mono.AddUpdateListener(listener);
        }

        public void RemoveUpdateListener(UnityAction listener)
        {
            _mono.RemoveUpdateListener(listener);
        }
        //此外我们还可以添加协程方法,原理都一样,方法体内直接通过_mono对象调用PublicMono的协程。
    }
}

BaseSingleton<>

这里将基础单例类的代码也粘出来

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


/*
Editor:
Version:
The last time for modification:
Time for Creation:
*/
namespace CsharpBaseModule.Singleton
{
    /// <summary>
    /// 基础单例类,线程不安全
    /// </summary>
    public class BaseSingleton<T> where T : new()
    {
        private static T _instance;
        public static T GetInstance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new T();
                }
                return _instance;
            }
        }
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值