如何管理Unity3D实例/单例

如何管理Unity3D实例/单例,unity3d,dependency-injection,ioc-container,Unity3d,Dependency Injection,Ioc Container,注意:我有多年的开发经验,但我是Unity的初学者 我想知道在不同场景中管理游戏对象的最佳实践是什么 您可能知道,每个场景都有一个带有实际实例的层次结构树,假设我有一个ScoreManager游戏对象,我只想实例化一次,但我想避免使用单例模式。(因为这是一个坏习惯)。我们还假设ScoreManager需要一个LevelsManager实例,等等 我熟悉的一个解决方案是依赖注入,但我确实找到了任何使用它的教程。我看到的所有教程在层次结构树中实例化游戏对象,通过公共属性链接其他游戏对象。。。这可以算

注意:我有多年的开发经验,但我是Unity的初学者

我想知道在不同场景中管理游戏对象的最佳实践是什么

您可能知道,每个场景都有一个带有实际实例的层次结构树,假设我有一个ScoreManager游戏对象,我只想实例化一次,但我想避免使用单例模式。(因为这是一个坏习惯)。我们还假设ScoreManager需要一个LevelsManager实例,等等

我熟悉的一个解决方案是依赖注入,但我确实找到了任何使用它的教程。我看到的所有教程在层次结构树中实例化游戏对象,通过公共属性链接其他游戏对象。。。这可以算作进行依赖项注入的一种方式,但仅适用于当前场景

那么,你有一个好的实践,你使用和爱吗

谢谢

编辑:

建议,问题是您应该在第一个场景层次中只放置一个游戏对象,例如WelcomeScene,它将保留在未来加载的所有场景中

问题是你可能想测试(按Play键)比如说在level01场景中需要这个游戏对象存在,但它不存在,你必须先加载在继承权中有这个游戏对象的WelcomeScene

将同一个游戏对象也放在level01场景中会导致它被复制,并且永远不会破坏

要解决这种重复,唯一的解决方案(据我所知)是使用Singleton。这不是“世界末日”,但这是这个问题的目的。任何其他处理此问题的最佳实践(在Unity中)?

都非常强大。他们的Github页面上也有一些很好的文档说明了很多问题。这是管理全局绑定的好方法

但是,如果您想要更简单的东西,可以从单例类继承。大多数人会反对它,但它确实有效,而且非常简单

public class SingletonController : MonoBehaviour {
 public static SingletonController Instance;

 private void Awake() {
  if (Instance != null) {
   Destroy(gameObject);
  } else {
   Instance = this;
  }
 }
}

检查它将允许你通过不同的场景传递游戏对象。DontDestroyOnLoad阻止我测试当前编辑的场景…你能详细说明它是如何阻止你测试的吗?问题已编辑。如果这只是测试过程中的一个问题,你可以从中找出答案。这样,当您只想测试一个场景时,就可以快速地添加和删除它,同时仍然为您的实际应用程序使用DontDestroyOnLoad。如果这太费劲了,那么我能想到的唯一一件事就是检查它是否存在(因此基本上就是从中生成一个单例)