【发布时间】:2020-04-03 12:13:01
【问题描述】:
我对 Unity 还是很陌生,事实上 C# 也是如此!
我现在正在做的是:
- 我有一个“单例”(它不是真正的单例,但这不是重点)
GameObject称为GameManager,附有我的GameManager.cs脚本,其中包含大部分游戏信息(该教程文本已已显示,加载本地化文本的功能,加载最后一个场景...) - 作为
GameManager对象的子对象,我有不同类型的游戏对象,我也不想在加载时销毁,例如后处理配置文件、全局灯光、音频管理器、UI 画布(canvi?)和其他东西。 .
有很多关于 Unity 的优秀教程,它是一个很棒的社区,但我真的找不到任何关于 Unity 关于游戏对象管理的“最佳实践”的信息。
这是一个正确的方法吗?我将来会遇到这种方法的问题吗?我是否应该创建一个实现 Unity 的 DontDestroyOnLoad() 的通用类,并让我想要保留的对象继承自该类?有没有更好的办法?
目前它运行良好,但我想确保我没有以错误的方式执行此操作,并可能会破坏游戏的性能或稳定性。
非常感谢。
【问题讨论】:
-
这完全是基于意见的,因为它甚至完全是controversial 如果应该使用单例模式根本! Unity 的
DontDestroyOnLoad使得开始在各处使用单例非常诱人,是的,有时您至少需要一个在我看来应该控制所有其余部分的方法。不要使用多个! -
单例模式本身并不是最佳实践。它被认为是反模式是有充分理由的。完全不需要单例。如果您正在编写可测试和可扩展的软件,您应该更喜欢遵循依赖注入模式。通过这种方式,您可以将共享实例注入相关类。这实现了 Singleton 的所有优点,而没有 Singleton 的所有缺点(例如,您不能模拟静态代码)。单例模式的缺点是事实而非意见。
-
尽管负面事实确实是基于意见的,但您仍然可以或应该使用这种模式。如果你能付出代价(忍受所有的缺点)你可能很高兴。由于像MEF 这样的框架非常易于使用,因此单例可能永远不值这个价。 MEF 是一个功能强大且易于使用的框架,支持依赖注入和生命周期管理。
-
@BionicCode 单例模式有很多问题。但是建议 DI 更好就是忽略上下文:这是针对 Unity3D 的。 DI 对 Unity3D 来说是一个糟糕的匹配,因为正在创建的应用程序(游戏)和可用的 API 框架(正在迁移到 DOTS)。
标签: c# unity3d design-patterns singleton