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()
{
// 这个脚本只要挂载到场景上,就会触发Awake
instance = 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;
}
// 子类能够重写Awake
protected 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就行了
:::
```csharp
using 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);
}
}