我有一个由玩家控制的softozor
游戏对象组成的“主”场景。这是一只飞扬的恐龙。作为该softozor
游戏对象的子代,我设置了另一个游戏对象Installer
,它由一个Transform组件和一个PlayerInstaller (Script)
组件组成:PlayerInstaller
安装播放机逻辑所需的所有内容。最后,在softozor
游戏对象中,我添加了Game Object Context (Script)
并注册了PlayerInstaller
:
除了softozor
游戏对象之外,我还定义了一个SceneContext
:
您会注意到,所有安装程序列表在该SceneContext
中都是空的。但是,如果该SceneContext
不进行任何注册,则不会触发PlayerInstaller
。使用该设置玩游戏效果很好,即调用PlayerInstaller
,我可以控制恐龙做我想做的事情。
到目前为止,一切都很好。现在,考虑以下场景测试:
public class PlayerTests : SceneTestFixture
{
[Inject]
private IPlayer _player;
[UnityTest]
public IEnumerator TestScene()
{
yield return LoadScene("Main");
_player.Flap();
yield return new WaitForSeconds(0.01f);
[...]
}
}
在该测试中,不会向
_player
成员变量注入满足IPlayer
约定的对象。实际上,不会调用PlayerInstaller.InstallBindings()
。如果是I,则摆脱我的
Game Object Context (Script)
游戏对象中的softozor
组件,并在PlayerInstaller
中注册SceneContext
:然后我也可以像以前一样玩游戏,并且我的测试正在运行,即在我的场景测试期间调用
PlayerInstaller.InstallBindings()
方法。在
PlayerInstaller
游戏对象上下文中注册softozor
的第一次尝试有什么问题?我正在与
Zenject版本7.3.1
Unity 2019.1.8f1 PC,Mac和Linux独立版
最佳答案
因此,您有两个容器,分别是SceneContext
和GameObjectContext
。
我认为这里发生的是它们都已安装,但是您的GameObjectContext
并未添加到SceneContext
中-在SceneContext
实际需要了解GameObjectContext
之前,它一直起作用(您的情况就是这样)现场测试)。
不知道什么是IPlayer
以及您希望在那里注入什么,很难给出更精确的指示,但是有意义的是它不是注入到您的SceneContext
中,而是注入到您的GameObjectContext
中。
通过将PlayerInstaller
放在SceneContext
的MonoInstallers列表中,可以从技术上解决该问题,但这显然不是您想要的,因为它使子容器无用并破坏了您要进行的任何分离。
取而代之的是,您需要使用立面:Sub-containers and Facades: Using GameObjectContexts来连接这两个上下文(说明由一个示例组成,因此我引述其中的部分内容没有任何意义,但它详尽且有用)
关于unity3d - 在某些情况下,不会在场景测试中调用Zenject Mono Installer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57286720/