zoukankan      html  css  js  c++  java
  • unity3d中设计模式的学习<一>:泛型单例

    单例是游戏开发中比较常见的设计模式,虽然针对的功能不同,但是有一些功能还是共有的,代码也不少,如果能放在一个基类里面是最好不过了,但是单例里需要有个instance功能来返回当前对象,所以这个功能必须是static的,没办法直接继承,之前看了《面向对象的游戏开发》这本书里,使用的是泛型,于是我实验了几次

    现在我们就来实现这个较为简单的单例泛型:

    public class Singleton<T> : MonoBehaviour where T: MonoBehaviour //因为继承MonoBehaviour的物体不能使用new()来构造实例 所以这里只能用MonoBehaviour
    {
        private static T instance; //实例目标对象
    
        protected virtual void Awake()  
        {
            this.CheckInstance(); //觉醒检查
        }
    
        protected bool CheckInstance()//是否唯一,不是就销毁多余的目标,防止目标有多个挂载在其他gameobject上。
        {
            if (this == Singleton<T>.Instance)
            {
                return true;
            }
            UnityEngine.Object.Destroy(this);
            return false;
        }
    
        public static T Instance 
        {
            get
            {
                if (Singleton<T>.instance == null)
                {
                    Singleton<T>.instance = (T) UnityEngine.Object.FindObjectOfType(typeof(T));// 如果对象没实例化,则为空
                    if (Singleton<T>.instance == null)
                    {
                        Debug.LogError(typeof(T) + " was no attached GameObject");
                    }
                }
                return Singleton<T>.instance;
            }
        }
    }

    基类做好了,然后下面是派生出的各种功能的单例:

    public class PlayerCtrl : Singleton<PlayerCtrl>
    {
           .............................................
    }
    
    
    public class GameManager: Singleton<GameManager>
    {
           .............................................
    }

    注意到,基类是泛型,所以每个Singleton<T>都是不同的实例 使用时 直接 Singleton<PlayerCtrl>.Instance 就可以返回单例的PlayerCtrl

  • 相关阅读:
    视频4K技术的解读
    C语言野指针
    获取一个整数所有的质因数(C语言实现)
    乘法口诀表(C语言实现)
    完全平方数(C语言实现)
    Socket网络编程系列教程序
    求1-2/3+3/5-4/7+......49/97和(C语言实现)
    反射
    Cloneable接口和Object的clone()方法
    Comparable和Comparator的区别
  • 原文地址:https://www.cnblogs.com/Persona/p/4100936.html
Copyright © 2011-2022 走看看