c# - Unity 中是否有“Singletons”(持久游戏对象)的最佳实践?
问题描述
我对 Unity 很陌生,事实上 C# 也是如此!
我现在正在做的是:
GameObject
我有一个名为的“单例”(它不是真正的单例,但这不是重点)GameManager
,它附加了我的GameManager.cs
脚本,其中包含大部分游戏信息(已经显示了教程文本,加载本地化文本的功能,加载了最后一个场景...)- 作为这个对象的子
GameManager
对象,我有不同类型的游戏对象,我也不想在加载时销毁,例如后处理配置文件、全局灯光、音频管理器、UI 画布(canvi?)和其他东西......
Unity 有很多很棒的教程,而且它是一个很棒的社区,但是我真的找不到任何关于 Unity 关于游戏对象管理的“最佳实践”的信息。
这是一个正确的方法吗?我将来会遇到这种方法的问题吗?我是否应该创建一个实现 Unity 的通用类DontDestroyOnLoad()
并让我想要从该类继承的对象?有没有更好的办法?
它现在工作正常,但我想确保我没有以错误的方式做这件事,并且可能会扰乱我的游戏性能或稳定性。
提前谢谢了。
解决方案
这里有两个最佳实践。
构建大量单例,并替换 Unity 内置的初始化系统
构建很少的单例,并在 Unity 的初始化系统中工作,并大量使用新的多场景编辑系统。
选项 1 非常受游戏工作室和专业游戏开发者的欢迎,他们擅长此操作并且之前已经做过很多次。主要的问题是,一旦你开始走这条路,你就致力于维护你自己的并行初始化系统。主要优点是您的系统可能比 Unity 的内部系统更好,肯定更强大,而且通常更快(!)。
选项 2 更受游戏编程新手的欢迎,他们希望尽可能多地使用 Unity 的内置功能。
也就是说,您的问题中有一些奇怪的事情。
例如......帆布?你到底为什么要把 Canvas 变成一个单例?这表明您在很大程度上滥用了 Canvas(可能还有其他一些类)。
标准方法(也是 Unity 唯一支持的方法)是让每个场景都有自己独特的画布。做一些不同的事情……很奇怪。
我怀疑您误解了“DontDestoryOnLoad”的作用。它不能防止东西在加载时被破坏!
相反,它可以防止在加载新场景时被破坏,并且它们只存在于旧场景中。一个更好的名字应该是:“DontDestroyWhenLoadingANewScene”
使用 DontDestroyOnLoad 在 Unity 中有很多错误(可以追溯到很多年前),因此通常最好尽可能避免它。对于简单的情况,它工作得很好,但如果你使用它太多,你会遇到复杂的边缘情况以及与 Unity 自己的内部类的交互。
推荐阅读
- mysql - 在第 45 行处理 JSP 页面 /verifyUser.jsp 时发生异常
- java - 谓词接口中的 Java 泛型方法
- c# - Xamarin Android:同步读取本地存储(PCLStorage)文件
- python - 删除带有单元格的行,检查其字符串或 int
- typescript - NGRX 与 Immutable.js
- html - 是否可以在画布内的选定区域内填充图像?
- java - 在循环中使用 if 语句?- 加工
- angular - 我们是否需要付费的 firebase/firestore 帐户来实施条带支付?
- wpf - “在 wpf xaml 中使用或不使用 ResourceDictionary 来包装我的资源”有什么区别吗?
- google-chrome - 如何在chrome中的当前标签之后立即打开一个新标签?