1

我的游戏有很多子系统。他们可以互相使用。早些时候,我正在初始化子系统引用并将其存储到静态 Game 对象中,而不是制作单例。现在我看到 Game 对其他类的引用太多,看起来很混乱:

public static PlayerSettings PlayerSettings { get { return _playerSettings; } }

public static CommunityClient Community { get; private set; }
public static DatabaseConnectionWrapper Database { get; set; }
public static LoginConnectionWrapper LoginProtocolConnection { get; set; }
public static WorldEmulatorConnection WorldEmulatorConnection { get; set; }
public static WorldPlayerConnection WorldPlayerConnection { get; set; }
public static WorldConnection WorldConnection { get { return IsEmulatorMode ? (WorldConnection)WorldEmulatorConnection : WorldPlayerConnection; } }

public static MusicManager MusicManager { get; private set; }
public static SkyboxManager SkyboxManager { get; private set; }

public static VKInfo VK { get; private set; }

我能处理什么呢?我不需要这些子系统的抽象。而且我认为单例并不适合这种情况 - 架构看起来被分割成碎片。我想从一个地方以正确的顺序初始化我的所有子系统。但是引用的类太多了...


添加
查看 DI - 我可以将依赖项发送到类构造函数并初始化静态工厂中的每个类。这就是我要找的。
但是我刚刚意识到我的问题是,当我尝试使用 Unity3D 对象组件架构时,我无法将依赖关系发送到构造函数,因为类初始化是从 UnityEngine 调用的。
所以在这种情况下,我需要 Singleton 或 Blob 来保留引用。如果我抛弃 Unity 架构,那么我将从构造函数获取所有依赖项,并且不需要单例或 blob。
我需要重新设计我的架构,UnityEngine 不会创建需要获取子系统引用的对象,而是从我的代码中创建这些类,并让他们创建和管理他们的 UnityEngine“游戏对象”。

4

2 回答 2

0

我认为你把事情复杂化了弗拉德。

由于您的管理器、控制器和诸如此类的东西不需要从 MonoBehaviour 继承,这就变成了将子系统组织在一个对象下的简单案例,该对象只是作为访问它们的便利点。

如果您有实际需要具有 MonoBehaviour 的管理器对象,则可以通过简单的 OnLevelLoaded 事件从加载的场景中获取这些引用,或者您自己将从实际触发场景加载的任何对象中引发的事件。触发事件后,使用 Unity api 提供的 FindObjectOfType 方法从场景中查找您的游戏对象。

因此,在一天结束时,一个单例类,即您的上帝对象将跟踪您的所有子系统,任何场景绑定都将通过使用简单的 api 调用从加载的场景中收集。

这里的所有都是它的。听起来可能很复杂,但事实并非如此。

于 2013-06-13T12:53:33.327 回答
0

查看 DI - 我可以将依赖项发送到类构造函数并初始化静态工厂中的每个类。这就是我要找的。但是我刚刚意识到我的问题是,当我尝试使用 Unity3D 对象组件架构时,我无法将依赖关系发送到构造函数,因为类初始化是从 UnityEngine 调用的。所以在这种情况下,我需要 Singleton 或 Blob 来保留引用。如果我抛弃 Unity 架构,那么我将从构造函数获取所有依赖项,并且不需要单例或 blob。我需要重新设计我的架构,UnityEngine 不会创建需要获取子系统引用的对象,而是从我的代码中创建这些类,并让它们创建和管理他们的 UnityEngine“游戏对象”。

于 2013-06-13T07:54:18.783 回答