设计模式之一单例,单例的管理

本文详细介绍了在Unity中使用C#实现单例模式的两种方法:一种是纯C#方式,另一种是结合 MonoBehaviour 的方式。通过这两种方法,可以确保游戏运行期间只存在一个实例,并在需要时提供该实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

public class ManagerBase<T> where T : ManagerBase<T>
{
    private static T _instance;

    public static T Instance
    {
        get
        {
            if (_instance != null) return _instance;

            _instance = Activator.CreateInstance<T>();
            SingletonManager.Add(_instance);

            _instance.init();

            return _instance;
        }
    }


    protected virtual void init()
    {
        
    }
}

public class MonoManagerBase<T> : SimMonoBehaviour where T : MonoManagerBase<T>
{
    protected static T _instance;

    public static T instance
    {
        get
        {
            if (_instance != null) return _instance;

            GameObject obj = new GameObject(typeof(T).ToString());
            obj.transform.SetParent(SingletonManager.parent);
            _instance = obj.AddComponent<T>();
            SingletonManager.AddMonoManager(_instance);

            return _instance;
        }
    }

    protected override void Awake()
    {
        if (_instance == null)
        {
            _instance = (T)this;
            _instance.init();
            SingletonManager.AddMonoManager(_instance);
        }
        base.Awake();
    }

    protected virtual void init()
    {

    }

    protected override void OnDestroy()
    {
        base.OnDestroy();

        SingletonManager.removeMonoManager(_instance);
    }
}
public static class SingletonManager
{
    private static Transform _parent;
    public static Transform parent
    {
        get
        {
            if (_parent == null)
            {
                GameObject obj = new GameObject("MonoManager");
                _parent = obj.transform;
                UnityEngine.Object.DontDestroyOnLoad(_parent);
            }
            return _parent;
        }
    }


    /// <summary>
    /// 保存单例
    /// </summary>
    private static List<object> managerList = new List<object>();

    /// <summary>
    /// 基于mono的
    /// </summary>
    private static List<object> monoManagerList = new List<object>();

    public static void Add(object ins)
    {
        managerList.Add(ins);
    }

    public static void AddMonoManager(object ins)
    {
        monoManagerList.Add(ins);
    }

    public static void removeMonoManager(object ins)
    {
        monoManagerList.Remove(ins);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值