【Unity】非MonoBehaviour子类的单例管理

单例管理类代码

/**********************************************************************
 *Copyright(C) 2016 by zhiheng.shao
 *All rights reserved.
 *FileName:     SingletonContainer.cs
 *Author:       zhiheng.shao
 *Version:      1.0
 *UnityVersion:5.3.3f1
 *Date:         2016-04-20
 *Description:   
 *History:  
**********************************************************************/
using UnityEngine;
using System.Collections.Generic;
using System.Collections;

namespace Rickshao.Singleton
{
    public class SingletonContainer : Singleton<SingletonContainer>
    { 
        public T GetInstance<T>() where T : new()
        {
            string singletonName = typeof(T).ToString();
            T singleton = Container<T>.Get(singletonName);
            if (singleton == null)
            {
                singleton = new T();
                Container<T>.Set(singletonName, singleton);
            }
            return singleton;
        }

        private static class Container<T>
        {
            private static Dictionary<string, T> m_Collections = new Dictionary<string, T>();

            public static Dictionary<string, T> Collections { get { return m_Collections; } }

            public static T Get(string singletonName)
            {
                if (m_Collections.ContainsKey(singletonName))
                {
                    return (T)m_Collections[singletonName];
                }
                return default(T);
            }

            public static void Set(string singletonName, T singleton)
            {
                m_Collections.Add(singletonName, singleton);
            }
        }
    }
}

使用示例

/*********************************************************************************
 *Copyright(C) 2016 by zhiheng.shao email:zhiheng.rick@gmail.com
 *All rights reserved.
 *FileName:     BaseFlow.cs
 *Author:       zhiheng.shao email:zhiheng.rick@gmail.com
 *Version:      1.0
 *UnityVersion:5.3.5f1
 *Date:         2016-07-21
 *Description:   
 *History: 
**********************************************************************************/
using UnityEngine;
using System.Collections;
using Rickshao.StateMachine;
using Rickshao.Singleton;

//TODO: 换成单例
namespace KickBall.Main.GameFlow
{
    public abstract class BaseFlow<T> : IState<GameFlowController> where T : BaseFlow<T>, new()
    {
        public static T Instance 
        {
            get 
            {
                return SingletonContainer.Instance.GetInstance<T>();
            }
        }

        /// <summary> 获取状态名 </summary>
        /// <returns></returns>
        public string GetStateName() 
        {
            return GetType().ToString();
        }

        public abstract void Enter();

        public abstract void Exit();
    }
}
### Unity 中支持继承的类实现方式 在 Unity 中,为了实现一个可以被其他类继承的模式,通常会设计一个通用的基类。以下是两种常见的实现方式:基于泛型的类和基于 `MonoBehaviour` 的类。 --- #### 一、基于泛型的类实现 这种实现方式允许任何类通过继承泛型基类来获得特性[^2]。 ```csharp public class Singleton<T> where T : class, new() { private static T _instance; public static T Instance { get { if (_instance == null) { lock (typeof(T)) { if (_instance == null) { _instance = new T(); } } } return _instance; } } } ``` - **泛型约束**:通过 `where T : class, new()` 确保泛型类型为引用类型且具有无参构造函数。 - **线程安全**:使用 `lock` 关键字确保多线程环境下的实化安全性[^2]。 如,创建一个全局管理器类: ```csharp public class GameManager : Singleton<GameManager> { public string GameName { get; set; } } ``` 调用时可以直接访问实: ```csharp GameManager.Instance.GameName = "My Game"; ``` --- #### 二、基于 `MonoBehaviour` 的类实现 这种方式更适合 Unity 场景,因为 `MonoBehaviour` 提供了生命周期管理功能,如 `Awake` 和 `DontDestroyOnLoad`[^3]。 ```csharp public abstract class SingletonComponent<T> : MonoBehaviour where T : MonoBehaviour { private static T _instance; public static T Instance { get { if (_instance == null) { _instance = FindObjectOfType<T>(); if (_instance == null) { GameObject singletonObject = new GameObject(typeof(T).Name); _instance = singletonObject.AddComponent<T>(); DontDestroyOnLoad(singletonObject); } } return _instance; } } protected virtual void Awake() { if (_instance == null) { _instance = this as T; DontDestroyOnLoad(this.gameObject); } else if (_instance != this) { Destroy(this.gameObject); } } } ``` - **抽象类**:将逻辑封装在抽象类中,子类只需继承即可。 - **唯一性保证**:在 `Awake` 方法中检查是否已存在实,避免重复实化。 - **跨场景持久化**:调用 `DontDestroyOnLoad` 确保对象在场景切换时不被销毁。 如,创建一个全局管理器类: ```csharp public class UIManager : SingletonComponent<UIManager> { public void ShowMainMenu() { Debug.Log("Main Menu Shown"); } } ``` 调用时可以直接访问实: ```csharp UIManager.Instance.ShowMainMenu(); ``` --- #### 两种实现方式的对比 | 特性 | 泛型类 | MonoBehaviour 类 | |--------------------------|----------------------------------|-----------------------------------| | 是否需要继承 `MonoBehaviour` | 否 | 是 | | 是否支持跨场景持久化 | 需手动实现 | 自动支持 | | 生命周期管理 | 需手动管理 | 由 Unity 引擎自动管理 | | 使用场景 | 适用于 UI 类的全局数据管理[^2] | 适用于需要与 Unity 场景交互的类 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值