Unity中 单例模式

这篇具有很好参考价值的文章主要介绍了Unity中 单例模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

单例模式

1.静态方法访问

在Unity中,"单例模式"(Singleton Pattern)是一种常见的软件设计模式。它用于确保一个类只有一个唯一的实例,并提供一种全局访问点,使得其他类可以轻松地访问该唯一实例。

在游戏开发中,特别是使用Unity引擎时,单例模式经常用于管理全局的状态、资源、设置或其他对象,以确保它们在整个游戏中始终只存在一个实例,从而避免不必要的重复创建和管理实例。

实现一个Unity单例模式通常涉及以下几个步骤:

1. 私有构造函数:为了防止在类外部创建新的实例,将构造函数设为私有,这样其他类就不能直接通过  new  关键字来实例化该类。

2. 静态实例变量:在类内部创建一个静态(static)的类实例变量,这将是该类的唯一实例。

3. 静态访问方法:提供一个静态方法(通常命名为  GetInstance()  或  Instance()  等),使得其他类可以通过调用这个方法来获取该类的唯一实例。

4. 确保唯一性:在静态访问方法中,确保只有一个实例被创建。如果实例还不存在,则在方法内部创建一个新实例并返回;如果实例已经存在,则直接返回已有的实例。

下面是一个简单的Unity C#脚本示例,展示了如何实现一个基本的单例模式:

public class MySingleton : MonoBehaviour

{

    private static MySingleton instance;



    // 私有构造函数

    private MySingleton() { }



    // 静态访问方法

    public static MySingleton GetInstance()

    {

        if (instance == null)

        {

            instance = new GameObject("MySingleton").AddComponent<MySingleton>();

        }

        return instance;

    }



    // 可选:添加其他功能和数据到这个单例类

}

在上面的例子中,  MySingleton  类的构造函数被设置为私有,只能在类的内部访问。通过  GetInstance()  方法,其他类可以获取到  MySingleton  类的唯一实例。如果该实例不存在,它将在内部被创建,否则直接返回已有的实例。

请注意,尽管单例模式在某些情况下很有用,但过度使用它可能会导致代码难以维护和测试。在使用单例模式时,应该谨慎考虑其实际需求,避免过度使用全局状态。

2.静态字段访问

如果我们想直接使用  instance  这个变量,我们可以将  instance  定义为公共字段而不是属性。这样,在其他脚本中就可以直接通过  GameManager.instance  来访问它。

public class GameManager : MonoBehaviour

{

    public static GameManager instance;



    private void Awake()

    {

        if(instance!=null)

        {

            Destroy(gameObject);

        }

        else

        {

            instance = this;

            DontDestroyOnLoad(gameObject);

        }

    }



    public void Walk()

    {

        // 实现 Walk 方法的代码

    }

}

在上面的例子中,  GameManager  类的  instance  字段被定义为公共静态。在  Awake()  方法中,如果  instance  为  null  ,则将当前实例赋值给  instance  ,否则销毁重复的实例。这样,我们就可以在其他脚本中通过  GameManager.instance  来访问  GameManager  的唯一实例。

在其他脚本中,我们可以这样使用:

GameManager.instance.Walk();

这样就可以直接调用  Walk()  方法而无需加括号。请注意,使用这种方式时,确保在调用  GameManager.instance  之前,  GameManager  类的实例已经被正确初始化。

3.两种方法比较

两种方法各有优缺点,取决于我们的需求和项目的规模。让我们来比较一下:

(1)使用静态方法:

优点:

     易于理解和维护:使用  GetInstance()  等明确的静态方法,可以清楚地表明我们正在获取单例实例。

     更好的封装:通过静态方法,可以对实例创建的逻辑进行更好的封装,确保在获取实例时进行一些初始化或其他操作。

     更安全:可以更好地控制实例的创建过程,避免因不当的直接访问导致的意外行为。

缺点:

     冗余代码:在使用单例的时候,可能需要多次写  GetInstance()  方法调用,造成一定程度的代码冗余。

(2)使用公共静态字段:

优点:

     简洁:直接使用  GameManager.instance  来访问单例实例,代码更加简洁明了。

     减少方法调用:省略了调用静态方法的过程,直接使用字段访问。

缺点:

     可读性和维护性较差:在代码中,我们无法清楚地看出  instance  是来自单例模式的,初次阅读代码可能会不太容易理解。

     可能不够安全:由于没有封装的控制,其他代码可能会直接修改或重置  instance  ,可能导致单例实例状态的不稳定。

综上所述,如果我们更关注代码的可读性、维护性和安全性,推荐使用静态方法来获取单例实例。这种方式使代码更具意图,并且允许在获取实例时进行更好的封装和控制。

如果我们更看重代码的简洁性,并且确认在项目中不会出现意外的直接修改  instance  的情况,使用公共静态字段可能会更加方便。

不管选择哪种方式,确保单例的创建和初始化逻辑是正确的,并且在使用单例实例时要小心避免潜在的错误和异常。文章来源地址https://www.toymoban.com/news/detail-857220.html

到了这里,关于Unity中 单例模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Unity] No.1 Single单例模式

    定义 :单例模式是指在内存中只会 创建且仅创建一次对象的设计模式 。在程序中 多次使用同一个对象且作用相同 时,为了 防止频繁地创建对象使得内存飙升 ,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。在Unity的编程中比如

    2024年02月01日
    浏览(27)
  • [Unity] 单例设计模式, 可供继承的单例组件模板类

    一个可供继承的单例组件模板类: 因为 Unity 是单线程的, 所以在这里没有必要使用双检索 例如你要创建一个全局的单例管理类, 可以这样使用: 尽量避免让 SingletonComponent 帮你创建组件, 因为它只是单纯的将组件创建, 并挂载到空对象上, 而不会进行任何其他行为. 如果你的组件

    2024年02月08日
    浏览(32)
  • Unity的三种单例模式(饿汉,懒汉,MonoBehaviour)

    单例的使用场景 ​ 对象全局唯一,且经常被使用。 static静态字段介绍 所有对象共享static属性,即static属性在此类中是唯一的。 static属性不会被GC回收,随着程序开始而创建,随着程序结束而销毁(so 不要滥用单例哦) 学过面向对象的小伙伴对static想必都不陌生,其具有的特质

    2023年04月15日
    浏览(34)
  • 【unity之IMGUI实践】单例模式管理面板对象【一】

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unityUI专题篇 🅰️ API:简单的旋转 解析: 1.采用单例模式,原因: 单例模式无法被纂改基类,适合当管理者 2.基类提取了子类所有的共

    2024年02月15日
    浏览(37)
  • 【unity之IMGUI实践】单例模式管理数据存储【二】

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unityUI专题篇 🅰️ 😶‍🌫️:步骤实现 1.首先将音乐数据封装在类中,不采用单例模式 2. 而后封装一个游戏数据类为单例模式:功能

    2024年02月16日
    浏览(32)
  • 【Unity3D日常开发】Unity3D中实现单例模式详解

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 首先,说一下,什么是 单例模式(Singleton) 。 单例模式是设计模式中常见的一种设计模式,目的是为了

    2024年02月02日
    浏览(48)
  • 【Unity之IMGUI脚本封装】—编译模式下控件可视化及其封装

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :UnityUI篇实战 缺点1:无法在编译过程进行可视化调整 缺点2:无法分辨率自适应 此图可忽略 UML类图 性能优化代码 完整代码: 按钮封装代

    2024年02月15日
    浏览(46)
  • Unity入门03——Unity脚本

    1.创建规则 不在VS中创建脚本了 可以放在Assets文件夹下的任何位置(建议同一文件夹管理) 类名和文件名必须一致,不然不能挂载(因为反射机制创建对象,会通过文件名去找Type) 建议不要使用中文名命名 没有特殊需求不用管命名空间 创建的脚本默认继承MonoBehavior 2.MonoBehavior基

    2023年04月09日
    浏览(33)
  • Unity-Unity脚本生命周期

    Unity脚本生命周期是指在Unity游戏引擎中,脚本在运行过程中所经历的各个阶段。这些阶段包括:初始化、更新、固定更新、销毁等。下面我们来详细讲解一下Unity脚本生命周期的各个阶段。 1. Awake Awake是脚本的初始化阶段,当脚本被实例化时,Awake函数会被调用且只执行一次

    2024年02月14日
    浏览(24)
  • Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动

    教程相关资源 Unity 3D游戏开发+脚本编程完整指南(工程文件+PPT).zip Unity 脚本概览 脚本编写并不困难,但是如果直接从细节开始讲起,会让 读者难以看到脚本编程的全貌。因此本章不急于阐述脚本编写 的细节,只介绍简单的修改物体位置、处理用户输入和检测碰 撞的方法

    2024年02月21日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包