using System.Collections;using System.Collections.Generic;using UnityEngine;public class NewBehaviourScript : MonoBehaviour{private static NewBehaviourScript instance;public static NewBehaviourScript GetInstance(){// 继承了Mono的脚本不能直接new// 只能通过拖动到对象上 或者 通过 加脚本的api// U3D内部帮助我们实例化它return instance; // 一个继承Mono的脚本肯定是挂载场景上一个GameObject上的,或者用脚本用AddComponent加的}private void Awake(){// 这个脚本只要挂载到场景上,就会触发Awakeinstance = this;// 问题 如果这个脚本被挂了多次, 单例模式就被破坏了, 只能指向最后一次Awake的对象}}
基类实现
using System.Collections;using System.Collections.Generic;using UnityEngine;// 继承了MonoBehavior的单例模式对象 需要我们自己保证它的唯一性public class SingletonMono<T> : MonoBehaviour where T : MonoBehaviour // 里氏转换原则:父类装子类{private static T instance;public static T GetInstance(){// 继承了Mono的脚本 不能够直接new// 只能通过拖动到对象上 或者 通过加脚本的api AddComponent去加脚本// U3D内部帮助我们实例化它return instance;}// 子类能够重写Awakeprotected virtual void Awake(){instance = this as T;}}
- 使用 ```csharp using System.Collections; using System.Collections.Generic; using UnityEngine;
public class NewBehaviourScript : SingletonMono
private void Start(){Debug.Log(NewBehaviourScript.GetInstance().name);}
}
<a name="PsNQR"></a># 自动实现的基类:::warning继承这种自动创建的 单例模式基类 不需要我们手动去拖 或者API去加 想用他直接GetInstance就行了:::```csharpusing System.Collections;using System.Collections.Generic;using UnityEngine;public class SingletonAutoMono<T> : MonoBehaviour where T : MonoBehaviour{private static T instance;public static T GetInstance(){if(instance == null){GameObject obj = new GameObject();// 设置对象名为脚本名obj.name = typeof(T).ToString();instance = obj.AddComponent<T>();}return instance;}}
例子:
using System.Collections;using System.Collections.Generic;using UnityEngine;public class TestScript : MonoBehaviour{void Start(){NewBehaviourScript.GetInstance().TestFun();}}
using System.Collections;using System.Collections.Generic;using UnityEngine;public class NewBehaviourScript : SingletonAutoMono<NewBehaviourScript>{public void TestFun(){Debug.Log(NewBehaviourScript.GetInstance().name);}}

