公共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;
}
}
}
}