首页 > 其他分享 >Unity之单例模式探索

Unity之单例模式探索

时间:2024-09-16 13:35:00浏览次数:10  
标签:探索 SingleBase instance Unity ObjectPool 单例 public pool

最近在使用 Unity 管理远程攻击的时候涉及到了对象池,又因为需要进行脚本之间的通信,而标准通信有略显麻烦,于是使用单例的方式进行脚本之间的伪通信

  • 废话不多说,首先登场的就是最为简单的单例实现方法

    public class SingleBase : MonoBehaviour
    {
        public static SingleBase Instance;
        void Awake() => Instace = this;
    }
    
    • 很明显, 首先在类的内部创建一个静态类引用
    • 接下来, 由于 Unity 中Awake()方法的实际调用在 C#脚本创建的时候,并且所有继承于 MonoBehaviour 的子类会自动创建实例,所以在Awake()方法中直接将引用赋值给 Instace
    • 如何调用?
    SingleBase.Instance //这样就可以直接访问该单例的所有public了
    
  • 如果提到安全问题,无外乎公有的问题和线程安全

    • 针对公有的问题,使用属性管理 get 就可以解决
    • 线程安全问题,只要在程序不动态创建单例不就解决了 dogo
  • 针对非继承于 MonoBehaviour 的类,就需要考虑类的实例化的问题
    这里以使用属性的方法来建立单例,其实可以不用

    public class SingleBase
    {
        private static SingleBase instance_pool;
        private SingleBase() {}
        public static SingleBase Instance
        {
            get
            {
                if (instance_pool == null)
                {
                      instance_pool = new ObjectPool();
                }
                return instance_pool;
            }
        }
    
  • 如果想以 MonoBehaviour 为父类的类创建一个空对象,并在其上附加这样的单例

    public class ObjectPool : MonoBehaviour
    {
        private static ObjectPool instance_pool;
        private ObjectPool() {}
        public static ObjectPool Instance
        {
            get
            {
                if (instance_pool == null)
                {
                    GameObject _obj = new GameObject();
                    _obj.name = typeof(ObjectPool).ToString();
                    instance_pool = _obj.AddComponent<ObjectPool>();
                }
                return instance_pool;
            }
        }
    
    • 之所以不能使用new方法,是因为MonoBehaviours会抛出异常,不允许使用new方法创建实例,原因也有迹可循,因为所有继承于它的子类都会自动创建实体.反正谁用谁知道
    • 这样的创建方法就会创建一个新的物体,并将此单例作为其类实例的引用,如果在其它地方由创建了这样一个实例,会将新创建的实例自动删除,即引用的实例不会变更

标签:探索,SingleBase,instance,Unity,ObjectPool,单例,public,pool
From: https://www.cnblogs.com/skybase/p/18416190

相关文章

  • 探索Kubernetes服务发现与Ingress的奥秘
    在云原生架构的深邃海洋中,第32天我们扬帆起航,探索Kubernetes服务发现与Ingress的广阔天地。这两项技术如同航海中的灯塔与航道,为Pod间的通信及外部访问提供了可靠的导航。服务发现:Pod间的隐形桥梁在Kubernetes集群中,服务发现机制允许Pod通过服务(Service)这一抽象层相互发现并进行通......
  • Java接口的艺术:探索接口特性与面向接口编程
     在Java的世界里,接口(Interface)是一种强大的抽象机制,它定义了一组方法规范,但不实现这些方法。接口在Java编程中扮演着至关重要的角色,特别是在实现多态和面向接口编程(Interface-OrientedProgramming,IOP)方面。本文将深入探讨Java接口的特性、接口实现多态的方式,以及面向接口编程的......
  • Android中的单例模式
    在Android开发中,单例模式(SingletonPattern)是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。单例模式在需要控制资源访问、管理共享资源或配置信息的场景下特别有用。在Android中,实现单例模式的方法有多种,但主要思想是一致的:私有化构造函数,......
  • 【Unity精品源码】Ultimate Character Controller:高级角色控制器完整解决方案
    ......
  • 探索鸿蒙应用开发中的沉浸式模式与安全区域文字颜色
    在鸿蒙应用开发中,实现沉浸式显示模式与改变安全区域文字颜色可以为用户带来更加流畅和美观的视觉体验,本文将详细介绍如何在鸿蒙应用中实现特定页面的沉浸式显示,以及在这个过程中遇到的问题和解决方案。效果展示开启沉浸式模式关闭沉浸式模式改变安全区域文字颜色一、......
  • 探索PHP命名空间自动加载:提升代码组织与维护效率
    在PHP开发中,随着项目规模的扩大,代码的管理与维护变得越来越复杂。为了提高代码的可维护性和组织性,PHP引入了命名空间和自动加载机制。通过合理使用这些特性,开发者可以有效减少命名冲突,并提升代码复用性和开发效率。命名空间是PHP中用来解决类、函数、常量之间命名冲突的工具。想......
  • Unity设计模式(1) FSM有限状态机
    有限状态机(FSM)的核心原理是基于状态和状态之间的转换。它可以用来描述系统的行为和流程,尤其是在处理离散事件和复杂逻辑时使代码有较强的可维护性及健壮性。为什么使用状态机在一开始学习程序的时候,你可能会陷入一种误区,就是想把所有事情全在一个脚本里给干了,可是当你需要在......
  • 探索C#编程:高效解决N皇后问题的回溯算法实现
    在C#中,回溯算法是一种通过探索所有可能的候选解来找出所有解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化来撤销上一步或上几步的计算,以获得新的候选解。这个过程一直进行,直到找到所有解或确定无解。回溯算法常用于解决组......
  • 创建型模式-单例模式
    单例模式有两种常见的实现方式:饿汉式和懒汉式。以下是它们的代码示例:1.饿汉式(EagerInitialization)在类加载时就创建实例,线程安全,适用于单例对象耗费资源较小的场景。publicclassSingletonEager{//在类加载时就创建实例privatestaticfinalSingletonEag......
  • 利士策分享:探索适宜娱乐,实现心灵宁静与成长
    利士策分享:探索适宜娱乐,实现心灵宁静与成长在探讨如何找到并实践适宜的娱乐方式时,我们可以从以下几个方面入手,结合具体建议和方法,让娱乐成为我们生活中的一抹亮色。一、明确娱乐目的首先,明确娱乐的目的至关重要。是为了放松身心、缓解压力,还是为了增进人际关系、拓宽视野?目......