首页 > 解决方案 > Unity 中是否有“Singletons”(持久游戏对象)的最佳实践?

问题描述

我对 Unity 很陌生,事实上 C# 也是如此!

我现在正在做的是:

Unity 有很多很棒的教程,而且它是一个很棒的社区,但是我真的找不到任何关于 Unity 关于游戏对象管理的“最佳实践”的信息。

这是一个正确的方法吗?我将来会遇到这种方法的问题吗?我是否应该创建一个实现 Unity 的通用类DontDestroyOnLoad()并让我想要从该类继承的对象?有没有更好的办法?

它现在工作正常,但我想确保我没有以错误的方式做这件事,并且可能会扰乱我的游戏性能或稳定性。

提前谢谢了。

标签: c#unity3ddesign-patternssingleton

解决方案


这里有两个最佳实践。

  1. 构建大量单例,并替换 Unity 内置的初始化系统

  2. 构建很少的单例,并在 Unity 的初始化系统中工作,并大量使用新的多场景编辑系统。

选项 1 非常受游戏工作室和专业游戏开发者的欢迎,他们擅长此操作并且之前已经做过很多次。主要的问题是,一旦你开始走这条路,你就致力于维护你自己的并行初始化系统。主要优点是您的系统可能比 Unity 的内部系统更好,肯定更强大,而且通常更快(!)。

选项 2 更受游戏编程新手的欢迎,他们希望尽可能多地使用 Unity 的内置功能。


也就是说,您的问题中有一些奇怪的事情。

例如......帆布?你到底为什么要把 Canvas 变成一个单例?这表明您在很大程度上滥用了 Canvas(可能还有其他一些类)。

标准方法(也是 Unity 唯一支持的方法)是让每个场景都有自己独特的画布。做一些不同的事情……很奇怪。

我怀疑您误解了“DontDestoryOnLoad”的作用。它不能防止东西在加载时被破坏!

相反,它可以防止在加载新场景时被破坏,并且它们只存在于旧场景中。一个更好的名字应该是:“DontDestroyWhenLoadingANewScene”

使用 DontDestroyOnLoad 在 Unity 中有很多错误(可以追溯到很多年前),因此通常最好尽可能避免它。对于简单的情况,它工作得很好,但如果你使用它太多,你会遇到复杂的边缘情况以及与 Unity 自己的内部类的交互。


推荐阅读