Unity中单例的写法

什么是单例?
一个类有且仅有一个实例,它自行实例化并向整个系统提供这个实例。

作为最简单的设计模式之一,单例模式经常会被使用,但Unity中的写法与其他开发环境下有所不同。
要在Unity中保持一个单例,又要很方便的调用MonoBehaviour对象不报错,要对写法进行改造。
先上单例基类代码:Singleton.cs

using UnityEngine;

/// <summary>
/// 单例基类<br/>
/// <para>ZhangYu 2018-03-14</para>
/// </summary>
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour {

    // 单例
    private static T instance;

    /// <summary>获取单例</summary>
    public static T getInstance() {
        if (instance == null) {
            // 在已存在的脚本中查找单例
            instance = (T)FindObjectOfType(typeof(T));

            // 创建单例
            if (instance == null) new GameObject(typeof(T).Name).AddComponent<T>();
        }
        return instance;
    }

    // 获取单例/销毁重复对象
    protected virtual void Awake() {
        if (instance == null) {
            instance = this as T;
            init();
        } else if (instance != this) {
            Destroy(this);
        }
    }

    // 重空单例
    protected virtual void OnDestroy() {
        if (instance == this) instance = null;
    }

    // 初始化
    protected virtual void init() {

    }

}

用法:
自定义的单例继承Singleton并传入自己的类型。
例如:GameManager.cs

using UnityEngine;

public class GameManager : Singleton<GameManager> {

    protected override void init() {
        // 在这里写自己的代码
    }

}

情况1:当场景中已经存在一个GameManager,其他后出现的GameManager对象都会被销毁,保证系统中有且仅有一个实例。

情况2:当场景中无GameMananger时,会创建一个叫GameMananger的物体并附加脚本,自行实例化。
测试代码:Test.cs

using UnityEngine;

public class Test : MonoBehaviour {

    private void Start () {
        print(GameManager.getInstance());
    }
    
}

运行结果
自行实例化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值