Unity 单例写法

https://www.cnblogs.com/SHOR/p/5192046.html

借鉴自:http://www.cnblogs.com/CodeCabin/p/unity_global_manager.html

实现复杂一些的全局控制,如切换游戏关卡等操作,更常用的方式是使用单例类。
单例类的实现又分为两种:

  • 继承自MonoBehaviour的单例类
  • 纯C#的单例类

前者的优点是:

  • 可以在Inspector中显示,便于赋值和查看变量等;
  • 可以利用MonoBehaviour的接口;
  • 可以使用Coroutine。
  • 等等。

缺点也很多,主流的观点是能不继承MonoBehaviour就不要继承。

纯C#的单例类

实现起来简洁,易于理解。

普通的写法,不考虑多线程

public class MyClass
{
    private static readonly MyClass _instance = new MyClass();
    public static Class Instance {
        get {
            return _instance;
        }
    }    

    private MyClass() {}
}

线程安全的写法

检查两次。C#中使用lock关键字。

public class MyClass
{
    private static volatile MyClass _instance;
    private static object _lock = new object();

    public static MyClass Instance
    {
        get
        {
            if (_instance == null)
            {
                lock(_lock)
                {
                    if (_instance == null)
                        _instance = new MyClass();
                }
            }
            return _instance;
        }
    }

    private MyClass() {}
}

基于MonoBehaviour的单例类

普通的写法

利用了Unity的运行机制,从Awake处获取Unity创建的对象作为单例。
注意在Unity中不要使用new来创建MonoBehaviour实例。

public class MyClass : MonoBehaviour
{
    static MyClass _instance;

    void Awake () {
        _instance = this;
    }

    public static MyClass Instance {
        get {
            // 不需要再检查变量是否为null
            return _instance;
        }
    }
}

持久化的写法

使用DontDestroyOnLoad方法

public class MyClass : MonoBehaviour {

    static MyClass _instance;

    public static MyClass Instance
    {
      if (_instance == null)  // 如果没有找到
      {
         GameObject go = new GameObject("_MyClass"); // 创建一个新的GameObject
         DontDestroyOnLoad(go);  // 防止被销毁
         _instance = go.AddComponent<MyClass>(); // 将实例挂载到GameObject上
      }
      return _instance;
    }
}

原文地址:https://www.cnblogs.com/alps/p/9224392.html

时间: 2024-11-05 18:46:06

Unity 单例写法的相关文章

单例写法 转

如何正确地写出单例模式 1.懒汉式,线程不安全 这段代码简单明了,而且使用了懒加载模式,但是却存在致命的问题.当有多个线程并行调用 getInstance() 的时候,就会创建多个实例.也就是说在多线程下不能正常工作 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == nu

有一鲜为人知的单例写法-ThreadLocal

还有一鲜为人知的单例写法-ThreadLocal 源码范例 当我阅读FocusFinder和Choreographer的时候,我发现这两类的单例实现和我们平常用双重检查锁很不一样.而是用来一个ThreadLocal,这个也可以实现单例啊,那这个与双重检查锁实现的单例有什么区别呢? 1.FocusFinder /** * The algorithm used for finding the next focusable view in a given direction * from a view

Egret中的三种单例写法

1 普通的单例写法 class Single{ private static instance:Single; public static getInstance():Single{ if(this.instance == null){ this.instance = new Single(); } return this.instance; } public run(){ } } Single.getInstance().run(); 2 Module写法.仿照的Egret中Res资源类写法.

另一鲜为人知的单例写法-ThreadLocal

另一鲜为人知的单例写法-ThreadLocal 源代码范例 当我阅读FocusFinder和Choreographer的时候,我发现这两类的单例实现和我们寻经常使用双重检查锁非常不一样.而是用来一个ThreadLocal.这个也能够实现单例啊,那这个与双重检查锁实现的单例有什么差别呢? 1.FocusFinder /** * The algorithm used for finding the next focusable view in a given direction * from a v

性能比较好的单例写法

2019/10/27, .Net c#代码片段 摘要:一种性能比较好的单例写法 参考来源 其他单例思路: 1.使用依赖注入,注册为单例模式 2.使用双重锁机制 public sealed class SingletonBase//应该使用密封类防止派生 { //写单例的方法 //public string Getxxx(){ } private SingletonBase() { } public static SingletonBase Instance { get { return Nest

iOS单例写法简析

官方文档这样写的: static AccountManager *DefaultManager = nil; + (AccountManager *)defaultManager { if (!DefaultManager) DefaultManager = [[self allocWithZone:NULL] init]; return DefaultManager; } 在iOS4之后有了另外一种写法: + (AccountManager *)sharedManager { static A

使用单例时的三种单例写法

单例:一个类只有一个实例,在外部创建对象时,不能用alloc.(只要alloc,就会在堆区开辟空间,就意味着有多个对象)所以我们要提供一个创建对象的方法: 1.加号方法 2.返回值类型为当前类 3.方法名以default ,standared,main,shared等开头 + 当前类名 下面以Person类为例 在.h文件中声明 + (Person *)sharePerson; 在.m文件实现 第一种模式(单线程使用这种模式) + (Person *)sharePerson { 声明为stati

我喜欢的两种单例写法

1,第一种: 1 package ToolPackage 2 { 3 /** 4 * 提示 5 * @author tqr <br /> 6 * 创建时间:2014-11-7 下午6:27:10 7 */ 8 public class Tip 9 { 10 private static var instanceB:Boolean=true; 11 private static var instance:Tip; 12 13 public function Tip() 14 { 15 if (i

ios 线程安全单例写法

#import "DemoObj.h" @implementation DemoObj static DemoObj *instance; /** 1. 重写allocWithZone,用dispatch_once实例化一个静态变量 2. 写一个+sharedXXX方便其他类调用 */ // 在iOS中,所有对象的内存空间的分配,最终都会调用allocWithZone方法 // 如果要做单例,需要重写此方法 // GCD提供了一个方法,专门用来创建单例的 + (id)allocWith