关于Unity中类似Manager类的管理

这篇博客介绍了在Unity中如何使用单例模式管理类,特别是Manager类的使用。MonoSingleton是一个泛型单例类,确保在场景中只有一个实例,并提供按需加载的Instance属性,减少了不必要的性能消耗。文章还提供了代码示例,展示了如何创建和初始化单例,以及自定义初始化函数的使用。此外,强调了子类必须传递自身类型以正确继承和使用单例模式。
摘要由CSDN通过智能技术生成

关于Unity中类似Manager类的管理

什么是类似Manager类?

所谓类Manager类就是和Manager类相似的,拥有以下特征的类:

  1. 在Unity脚本中唯一。
  2. 在Unity脚本中经常被调用。

如果不做任何改变任由Unity其他脚本调用Manager类或者类似Manager管理类会造成不必要的性能消耗。(大量的使用脚本搜寻方法)。这时的解决方案我们可以添加一个Instance属性,让其他脚本直接调用Instance属性。

但是通常Unity中有不止一种Manager类。所以我们需要提取一个父类来对所有的Manager类进行管理。这就是脚本单例类。与传统的面向对象不同,我们不去调用父类,而是要直接调用子类Instance属性,并将所有的Instance属性初始化方式放入父类中。

下面为代码:MonoSingleton单例类


using UnityEngine;


/*
Editor:
Version:
The last time for modification:
Time for Creation:
*/
namespace Demo_XXManager
{
    /// <summary>
    /// 此类为脚本单例类。所有的其他脚本想要访问XXManager都需要使用XXManager继承于父类的Instance属性
    /// 所有继承此类的Manager类都需要在继承时表明自己的类型
    /// 此类适用于所有在场景中唯一且常用的类
    /// </summary>
    public class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
    {
        //单例实例字段,私有字段
        private static T instance;
        //单例实例属性,所有方法要访问XXManager都要通过XXManager的此方法来访问,同时为了防止有脚本在Awake中调用此Manager类,我们采用按需加载的方式来进行。
        //即有脚本调用了此属性,我们才会去初始化此属性。
        public static T Instance {
            get
            {
                //如果当前没有实例引用
                if (instance == null)
                {
                    //在场景中寻找实例对象
                    instance = FindObjectOfType<T>();
                    //如果场景中没有Manager的实例
                    if (instance == null)
                    {
                        //新建一个游戏对象并附加上XXManager管理类脚本此时会调用XXManager的Awake方法,默认调用了父类的Awake。
                        new GameObject("Singleton of " + typeof(T)).AddComponent<T>();
                    }
                }
                else
                {
                    //调用自定义初始化函数
                    instance.Init();
                }
                //如果有实例引用则直接返回。
                return instance;
            } 
        }
        //为了防止有的人喜欢直接将脚本挂载,这里也提供了Awake方法来进行初始化Instance属性。
        protected void Awake()
        {
            if (instance == null)
            {
                instance = this as T;
                Init();
            }
        }
        /// <summary>
        /// 自定义初始化函数,由于Awake函数用于初始化了,所以我们用一个自定义函数来做初始化工作
        /// </summary>
        public virtual void Init()
        {
            
        }
        /// <summary>
        /// 测试方法
        /// </summary>
        public virtual void Add()
        {
            Debug.Log("成功");
        }
    }
}

注意:XXManager类继承此类时应当将自己的类型也一并传过去,否则无法使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值