当前位置:   article > 正文

Unity3d中的单例模式_在unity中,当场景切换时,所有的游戏对象都会被销毁并重新创建。如果使用单例模式

在unity中,当场景切换时,所有的游戏对象都会被销毁并重新创建。如果使用单例模式

类中单例实现:

public class SceneMgr
{

    private static SceneMgr _Instance;

    /// <summary>
    /// 只读
    /// </summary>
    public static SceneMgr Instance
    {
        get
        {
            if(_Instance==null)
            {
                _Instance = new SceneMgr();
            }
            return _Instance;
        }
    }

    public void TestLog()
    {
        Debug.Log("执行单例");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

项目中多次使用单例,对单例进行封装


/// <summary>
/// 单例
/// </summary>
/// <typeparam name="T">子类继承时候会传给单例一个类型,且要求实例化</typeparam>
public class Singleton<T>:IDisposable where T:new()
{
    private static T instance;

    public static T Instance
    {
        get
        {
            if(instance==null)
            {
                instance = new T();
            }
            return instance;
        }
        
    }
}

public class SceneMgr : Singleton<SceneMgr>
{

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Unity中继承MonoBehaviour下的单例

Unity中继承MonoBehaviour脚本有两个特性:

  1. MonoBehaviour不能使用构造函数进行实例化,只能挂载在GameObject上
  2. 当切换场景时,当前场景中的GameObject都会被销毁,这种情况下,单例对象也会被销毁。 如果不希望切换场景时,单例被销毁需要使用DontDestroyOnLoad(GameObject obj)函数。代码如下
public class BoxCtrl : MonoBehaviour
{
    private static BoxCtrl _Instance;

    public static BoxCtrl Instance
    {
        get
        {
            if(_Instance==null)
            {
                //创建一个新的物体
                GameObject obj = new GameObject("BoxCtrl");
                //将单例挂载在物体上
                _Instance = obj.AddComponent<BoxCtrl>();
                //使得加载场景时候,物体不会被摧毁
                DontDestroyOnLoad(obj);
            }
            return _Instance;
        }
    }

    public void Test()
    {
        Debug.Log("执行BoxCtrl单例");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

还有一种简单的单例方法,这种单例方法很简单,但是在当前场景中只能存在一个该脚本。

public class BoxCtrl : MonoBehaviour
{
    public static BoxCtrl Instance;

    void Awake()
    {
        Instance = this;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/332774
推荐阅读
相关标签
  

闽ICP备14008679号