首页 > 其他分享 >Unity游戏框架设计之单例Mono

Unity游戏框架设计之单例Mono

时间:2024-04-29 21:24:57浏览次数:18  
标签:游戏 Mono SingletonMono instance Unity 单例 gameObject

Unity游戏框架设计之单例 Mono

简单介绍

在编写 Unity 脚本的过程中,我们通常需要编写一些依赖于 MonBehaviour 生命周期且全局始终唯一的类,比如 EventManager、TaskManager、ResourceManager 和 UIManager 等等。

我们可以基于单例模式,设计出名为 SingletonMono 的单例类,然后让拥有上述特性的类继承于 SingletonMono 单例类,来保证这些类在游戏运行过程中始终唯一。

一般的脚本必须依赖于某个场景中的某个游戏对象。而在游戏运行的过程中,我们可能频繁的切换 Scene,而这可能导致我们在切换场景的过程中,不小心将 SingletonMono 单例类销毁,从而造成错误。因此我们需要将脚本依赖的游戏对象放到 DontDestroyOnLoad() 中,来保证场景切换不会导致 SingletonMono 单例类的销毁。

代码设计

public abstract class SingletonMono<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T _instance;

    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                Debug.LogWarning("必须先将组件添加到游戏对象上才能使用 Instance 实例。");
                _instance = FindObjectOfType<T>();
                if (_instance == null)
                {
                    GameObject gameObject = new GameObject();
                    DontDestroyOnLoad(gameObject);
                    gameObject.name = typeof(T).Name;
                    _instance = gameObject.AddComponent<T>();
                }
            }
            return _instance;
        }
    }

    protected virtual void Awake()
    {
        if (_instance == null)
        {
            DontDestroyOnLoad(gameObject);
            _instance = this as T;
            return;
        }
        Debug.LogWarning(("禁止多次创建单例脚本。"));
        Destroy(gameObject);
    }
}

代码说明

(一)游戏中所有需要使用 Unity 生命周期的单例类必须继承 SingletonMono,特别是 XXXMananger 类。

(二)保证所有继承 SingletonMono 类的脚本在游戏中全局唯一。

(三)保证所有继承 SingletonMono 类的脚本不会随着场景的卸载而销毁。

后记

由于个人能力有限,文中不免存在疏漏,恳求大家斧正,一起交流,共同进步。

标签:游戏,Mono,SingletonMono,instance,Unity,单例,gameObject
From: https://www.cnblogs.com/kkelin/p/18166660

相关文章

  • 设计模式01 -----单例模式
    单例模式是一种常见的设计模式,用于确保类只有一个实例,并提供一个全局访问点。这种模式通常用于管理共享资源,例如数据库连接、日志文件等。单例模式的主要特点包括:单一实例:该模式确保类只有一个实例存在,无论何时何地都可以访问到这个实例。全局访问点:单例模式提供了一个全局......
  • unity C# 每隔一段时间执行一次
    在Unity中使用C#编写脚本可以通过定时器来实现每隔一段时间执行一次的功能。下面是一种常见的实现方式:usingUnityEngine;publicclassTimerExample:MonoBehaviour{privatefloatinterval=2f;//设置时间间隔为2秒voidStart(){InvokeRepeating("Ex......
  • 更新!!!Unity移动端游戏性能优化简谱
    UWA官方出品,结合多年优化经验撰写了《Unity移动端游戏性能优化简谱》,文章从Unity移动端游戏优化的一些基础讨论出发,例举和分析了近几年基于Unity开发的移动端游戏项目中最为常见的部分性能问题,并展示了如何使用UWA的性能检测工具确定和解决这些问题。 (1)性能优化的基本逻辑......
  • Java四种实现单例模式
    饿汉式/***1.饿汉式:线程安全,耗费资源*场景:*资源共享:当需要在多个模块中共享同一个实例时*全局访问点:作为全局唯一的访问点,例如日志记录器、配置管理器等。*线程安全要求高:饿汉式单例模式在类加载时就创建实例,因此不存在线程安全问题,适合多线程环境下使用。*避......
  • 常用设计模式-单例模式
    单例模式(保证只有一个实例,并只提供一个访问实例的访问点)单例模式的创建方式:饿汉模式-静态变量packagecom.pattern;//饿汉模式-静态变量publicclassSingleton{//类初始化时,会立即加载该对象,线程天生安全,调用效率高privatestaticfinalSingletons......
  • Unity性能优化——字符串和文本
    字符串和文本字符串和文本的处理不当是Unity项目中性能问题的常见原因。在C#中,所有字符串均不可变。对字符串的任何操作均会导致分配一个完整的新字符串。这种操作的代价相对比较高,而且在大型字符串上、大型数据集上或紧凑循环中执行时,接连不断的重复的字符串可能发展成性能......
  • C#实现单例模式的几种方法
    C#实现单例模式的几种方法    C#中readonly的理解与使用   Readonly(C#参考)介绍单例模式是软件工程学中最富盛名的设计模式之一。从本质上看,单例模式只允许被其自身实例化一次,且向外部提供了一个访问该实例的接口。通常来说,单例对象进行实例化时一般不带参数,因为......
  • Unity的AOP应用 应用场景 C#
    在C#中,Unity容器是一个功能强大的依赖注入(DI)容器,它提供了丰富的配置选项来管理对象的生命周期,支持特殊类型的处理,并允许通过配置文件来简化注册和配置过程。同时,Unity还提供了面向切面编程(AOP)的功能,允许开发者在不改变现有代码逻辑的情况下,为对象的方法添加额外的行为。1.Unity......
  • Unity3D 打造基于AStar的寻路与导航详解
    Unity3D打造基于AStar的寻路与导航详解BYCW丶零夜 ​关注 2人赞同了该文章前言寻路与导航是游戏开发中非常重要的一部分,它可以让游戏中的角色自动寻找到目标位置,并避开障碍物。本文将介绍如何使用Unity3D打造基于AStar算法的寻路与导航解,包括技术详......
  • Unity获取指定文件夹下的所有文件
    usingSystem.IO;publicvoidGetFiles(){stringpath=string.Format("{0}",Application.streamingAssetsPath);//stringpath=string.Format("{0}",@"C:\Users\USER\Desktop\JXBWG\Assets\StreamingAssets&qu......