如何管理Unity3D实例/单例

时间:2017-11-15 15:21:19

标签: unity3d dependency-injection ioc-container

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

我想知道跨场景管理GameObjects的最佳做法是什么

正如您所知,每个场景都有一个包含实际实例的层次结构树,假设我有一个ScoreManager游戏对象,我只想实例化一次,但我想避免使用单例模式。 (因为这是一个不好的做法)。我们还要说ScoreManager需要一个LevelsManager实例,依此类推......

我熟悉的一个解决方案是依赖注入,但我找到了任何使用它的教程。我看到的所有教程都在Hierarchy树中实例化了GameObjects,通过公共属性链接其他GameObjects ......这可以算作做依赖注入的一种方式,但只适用于当前场景......

那么,你有一个很好的练习,你使用和爱吗?

谢谢!

修改

@Shogunivar建议DontDestroyOnLoad,问题在于您应该只在第一个场景层次结构中放置一个GameObject,例如 WelcomeScene ,它会在所有未来加载的场景。

问题在于你可能想测试(按Play)在 Level01Scene 上说需要此GameObject存在,但它不存在,你必须首先加载 WelcomeScene < / strong>在Heirarchy中有这个GameObject。

将相同的GameObject也放在 Level01Scene 上会导致它重复,并且永远不会破坏......

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

1 个答案:

答案 0 :(得分:1)

Zenject非常强大。他们的Github页面上有一些很棒的文档,可以解释很多。这是管理全局绑定的好方法。

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

public class SingletonController : MonoBehaviour {
 public static SingletonController Instance;

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