河南郑州旅游网站制作,wordpress摘要字数,网站链接地图是怎么做的,发软文是什么意思前言#xff1a;
Unity作为一款强大的游戏开发引擎#xff0c;其基础框架的设计对于项目的结构和性能有着重要的影响。其中#xff0c;单例模式是一种常用的设计模式#xff0c;用于确保一个类只有一个实例#xff0c;并提供一个全局访问点。
什么是单例模式#xff1f…前言
Unity作为一款强大的游戏开发引擎其基础框架的设计对于项目的结构和性能有着重要的影响。其中单例模式是一种常用的设计模式用于确保一个类只有一个实例并提供一个全局访问点。
什么是单例模式
单例模式是一种创建型设计模式其目的是确保一个类只有一个实例并提供一个全局访问点。在Unity中单例模式常用于管理全局数据、游戏状态或者资源管理。通过单例模式我们可以在整个应用程序中方便地访问特定的对象。
一、Unity中的单例模式实现不继承Mono的
1. 创建Singleton 首先我们需要创建一个BaseSingleton类该类负责管理单例实例的创建和访问。以下是一个简单的BaseSingleton类示例
//单例模式基类,泛型约束为存在无参构造函数非抽象类
//为什么约束因为使用了instance new T();
public class BaseSingletonT where T:new()
{private static T instance;//保护构造函数保证单例只能在内部创建protected BaseSingleton() { }public static T Instance{get{if (instance null){instance new T();}return instance;}}
}
2. 应用到Unity中的管理器 假设我们要创建一个GameManager作为全局的游戏管理器。我们可以通过继承BaseSingleton类来实现GameManager的单例模式
public class GameManager : BaseSingletonGameManager
{// 在这里定义GameManager的其他属性和方法public void StartGame(){}}
3. 在其他类中访问单例 现在我们可以在其他类中轻松地访问GameManager的单例实例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Test : MonoBehaviour
{void Start(){// 通过GameManager.Instance访问GameManager的单例实例GameManger.Instance.StartGame();//StartGame()是在GameManager类里定义的一个方法}}通过这种方式我们可以方便地管理全局的游戏状态而无需担心多个实例的创建。 二、Unity中的单例模式实现继承Mono的
在Unity中经常会使用MonoBehaviour作为游戏对象的脚本组件会需要使用MonoBehaviour的相关方法。因此将单例模式与MonoBehaviour结合可以更好地适应游戏开发的需求。
1. 创建Singleton类
以下是一个继承MonoBehaviour的单例模式基类的实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SingletonMonoT : MonoBehaviour where T : MonoBehaviour
{private static T instance;public static T Instance{get{instance FindObjectOfTypeT();///判断场景中存不存在 该T 类型的的实例如果不存在 则在场景中创建一个空物体并加上该T组件if (instance null){GameObject singletonObject new GameObject(typeof(T).Name _Singleton);singletonObject.AddComponentT();DontDestroyOnLoad(singletonObject);}return instance;}}//使用virtual虚函数子类继承可能还需要用Awake()protected virtual void Awake(){// 确保在场景切换时不会销毁该实例DontDestroyOnLoad(gameObject);// 检查是否存在重复的实例if (instance null){instance this as T;}else{Debug.LogWarning(存在重复的单例 typeof(T).Name 删除);Destroy(gameObject);}}
}2. 应用到Unity中的管理器 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManger : SingletonMonoGameManger
{// 在这里定义GameManager的其他属性和方法public void StartGame(){Debug.LogError(调用单例);}}3. 在其他类中访问单例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Test : MonoBehaviour
{void Start(){// 通过GameManager.Instance访问GameManager的单例实例GameManger.Instance.StartGame();//StartGame()是在GameManager类里定义的一个方法}}
4.运行效果 当调用该单例中StartGame方法时 先创建了一个GameManger_Singleton物体并挂载了 GameManger组件 如下图 执行顺序如上图, 1 创建空物体2 挂载组件 3 执行方法
总结
单例模式是Unity中常用的设计模式之一特别适用于需要全局访问点的情况。通过创建一个Singleton类我们可以轻松地将其应用到不同的管理器或者全局性的对象中提高代码的可维护性和灵活性。在实际项目中根据具体需求可以对单例模式进行扩展和优化。 Unity自定义框架开发-CSDN博客