我有一个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()不叫。
相反,如果我摆脱我的游戏对象中的Game Object Context (Script)组件,并在以下位置注册:softozorPlayerInstallerSceneContext

然后我也可以像以前一样玩游戏,并且我的测试正在运行,即PlayerInstaller.InstallBindings()在我的场景测试期间调用该方法。
PlayerInstaller我在softozor游戏对象上下文中注册的第一次尝试有什么问题?
我正在与
- Zenject 版本。7.3.1
- Unity 2019.1.8f1 PC、Mac 和 Linux 独立版
