学习笔记:unity中单例模式入门&菜鸟写法(一)

单例模式

可以说最常见的一种设计模式了,也经常会出现在面试中
特点:简单,但是包含线程安全,内存模型,类加载机制等知识点

单例模式是什么,为什么需要单例模式?
单例模式:顾名思义,就是在运行时一个类只有一个实例对象。
有的类比较庞大和复杂,而且完全可以复用,这个时候就需要使用单例模式来避免重复的实例化对象来产生性能的浪费。

而在游戏开发中,单例模式经常是用来写一些管理类,管理UI界面,音效等等
更比如,人物从第一个场景到第二个场景,如何继承血量,装备等信息?(下一篇讨论)

简单的代码演示,先演示继承mono的单例

1.创建一个脚本UIManager,为单例模式

public class UIManager : MonoBehaviour
{
	public static UIManager instance;//全局访问得用static修饰
	private void Awake()
	{
		instance = this;//这个脚本挂载在任意对象上,实例就是脚本本身,即挂载后立即创建单例
	}

	//在在单例中添加一个方法演示调用
	public void Test() 
	{
		Debug.Log("Mono单例中的方法执行了");
	}
}

2.创建一个Test脚本调用单例

public class Test1 : MonoBehaviour
{
    void Start()
    {
        UIManager.instance.Test();
    }
}

将两脚本都挂在摄像机上,开始游戏,console窗口显示
在这里插入图片描述

演示不继承mono的单例,用C#传统的写法
因为不继承mono,此脚本不能挂载在对象上,只需要放在Asset下即可。
1.创建一个脚本UIManager2,为单例模式

public class UIManager2
{
	private static UIManager2 instance2;//用private修饰,然后用get方法访问
	public static UIManager2 Instance2
	{
		get 
		{
			if (instance2 == null) //空的话就创建一个,在真正需要实例的时候创建
			{
				instance2 = new UIManager2();		
			}
			return instance2;
		}
	}

	public void Test() 
	{
		Debug.Log("没有继承mono的单例中的方法执行了");
	}
}

2.修改Test脚本调用单例

public class Test1 : MonoBehaviour
{
    void Start()
    {
        UIManager.instance.Test();
        UIManager2.Instance2.Test();
    }
}

开始游戏,console窗口显示
在这里插入图片描述
另外:

对于单例模式有三个问题,需要遇到具体问题具体分析

1.是不是线程安全(多个线程同时调用,可能创建多个实例)
2.是不是懒加载(实例对象是第一次被调用时才真正创建,在不知道这个对象是否需要被真正调用时的情况下,这种方式比较合理)
3.能不能通过反射破坏

在下一篇文章讨论,如何实现人物从第一个场景到第二个场景,继承血量,装备等。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity 使用单例模式可以确保在整个游戏只有一个实例存在,方便在各个场景和对象之间共享数据和功能。以下是一个简单的示例代码,展示了如何在 Unity 调用单例模式: ```csharp public class SingletonExample : MonoBehaviour { private static SingletonExample instance; public static SingletonExample Instance { get { return instance; } } private void Awake() { if (instance != null && instance != this) { Destroy(this.gameObject); } else { instance = this; DontDestroyOnLoad(this.gameObject); } } // 在这里添加其他需要的功能和数据 public void SomeMethod() { // 执行某个方法 } } ``` 在上述代码,`SingletonExample` 类继承自 `MonoBehaviour`,并包含一个静态字段 `instance` 和一个静态属性 `Instance`。`Awake()` 方法在对象被创建时调用,它会检查 `instance` 是否已经存在,如果存在则销毁当前对象,否则将当前对象赋值给 `instance`,并通过 `DontDestroyOnLoad()` 方法保留该对象在场景切换时不被销毁。 在其他脚本,可以通过 `SingletonExample.Instance` 来访问单例对象,并调用其的方法或访问数据。例如: ```csharp public class OtherScript : MonoBehaviour { private void Start() { SingletonExample.Instance.SomeMethod(); } } ``` 以上代码演示了如何在 Unity 调用单例模式。使用单例模式可以方便地在游戏共享数据和功能,并确保只有一个实例存在。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值