公司网站建设应注意事项,网站建设兼职劳务协议,肇东市建设局网站,网站商城运营模式前提
继承MonoBehaviour的脚本不能new继承MonoBehaviour的脚本一定得依附在GameObject上
实现挂载式的单例模式基类
挂载式 继承Mono的单例模式基类 /// summary
/// 挂载式 继承Mono的单例模式基类
/// /summary
/// typeparam nameTsummary
/// 挂载式 继承Mono的单例模式基类
/// /summary
/// typeparam nameT/typeparam
public class SingletonMonoT: MonoBehaviour where T:MonoBehaviour
{private static T instance;public static T Instance{get{return instance;}}// 子类可能要重写Awake函数所以设置为虚函数protected virtual void Awake(){instance this as T;}
}
TestMgr2继承单例模式的基类然后把脚本挂在到游戏对象上去才能在Awake赋值 public class TestMgr2 : SingletonMonoTestMgr2
{private int i;protected override void Awake(){// 重写Awake时候这里不能省略base.Awake();i 0;}public void TestLog(){print(TestMgr2 i);}}
测试
public class Main : MonoBehaviour
{private void Start(){TestMgr2.Instance.TestLog();}}缺点
因为很容易被破坏单例模式的唯一性 1.挂载多个脚本 2.切换场景回来时由于场景放置了挂载脚本的对象回到该场景时 又会有一个该单例模式对象 3.还可以通过代码动态的添加多个该脚本 也会破坏唯一性
修改Awake /// summary
/// 挂载式 继承Mono的单例模式基类
/// /summary
/// typeparam nameT/typeparam
public class SingletonMonoT: MonoBehaviour where T:MonoBehaviour
{private static T instance;public static T Instance{get{return instance;}}// 子类可能要重写Awake函数所以设置为虚函数protected virtual void Awake(){//已经存在一个对应的单例模式对象了 不需要在有一个了if(instance ! null){// 只会移除脚本Destroy(this);return;}instance this as T;//我们挂载继承该单例模式基类的脚本后 依附的对象过场景时就不会被移除了//就可以保证在游戏的整个生命周期中都存在 DontDestroyOnLoad(this.gameObject);}
}实现自动挂载式的单例模式基类
创建单例模式基类SingletonAutoMono实现动态挂载脚本 /// summary
/// 自动挂载式的 继承Mono的单例模式基类
/// 推荐使用
/// 无需手动挂载 无需动态添加 无需关心切场景带来的问题
/// /summary
/// typeparam nameT/typeparam
public class SingletonAutoMonoT : MonoBehaviour where T:MonoBehaviour
{private static T instance;public static T Instance{get{if(instance null){//动态创建 动态挂载//在场景上创建空物体GameObject obj new GameObject();//得到T脚本的类名 为对象改名 这样再编辑器中可以明确的看到该//单例模式脚本对象依附的GameObjectobj.name typeof(T).ToString();//动态挂载对应的 单例模式脚本instance obj.AddComponentT();//过场景时不移除对象 保证它在整个游戏生命周期中都存在DontDestroyOnLoad(obj);}return instance;}}}Test2Mgr2继承单例模式基类
public class Test2Mgr2 : SingletonAutoMonoTest2Mgr2
{public void TestLog(){print(Test2Mgr2);}
}测试
public class Main : MonoBehaviour
{private void Start(){Test2Mgr2.Instance.TestLog();}}潜在的安全问题
构造函数问题 继承MonoBehaviour的函数不能new所以不用担心公共构造函数多线程问题 Unity主线程中相关内容不允许其他线程直接调用很少有这样的需求所以也不用太担心重复挂载问题 手动重复挂载代码重复添加
需要人为干涉定规则或者通过代码逻辑强制处理