gpt4 book ai didi

unity-game-engine - 在某些情况下,场景测试中未调用 Zenject Mono Installer

转载 作者:行者123 更新时间:2023-11-28 20:35:06 24 4
gpt4 key购买 nike

我有一个“主要”场景,它由一个由玩家控制的 softozor 游戏对象组成。这是一只活泼的恐龙。作为 softozor 游戏对象的子项,我设置了另一个游戏对象 Installer,它由一个 Transform 组件和一个 PlayerInstaller (Script) 组成组件:

image

PlayerInstaller 安装播放器逻辑所需的一切。最后,在 softozor 游戏对象中,我添加了一个 Game Object Context (Script),我在其中注册了 PlayerInstaller:

image

除了softozor游戏对象,我还定义了一个SceneContext:

image

您会注意到 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 成员变量未注入(inject)满足IPlayer 契约的对象。实际上,不会调用 PlayerInstaller.InstallBindings()

相反,如果我去掉 softozor 游戏对象中的 Game Object Context (Script) 组件,并注册 PlayerInstallerSceneContext 中:

image

然后我也可以像以前一样玩游戏,并且我的测试正在运行,即 PlayerInstaller.InstallBindings() 方法在我的场景测试期间被调用。

我第一次尝试在 softozor 游戏对象上下文中注册 PlayerInstaller 有什么问题?

我在工作

  • Zenject 版本。 7.3.1
  • Unity 2019.1.8f1 PC、Mac 和 Linux 独立版

最佳答案

所以你有两个容器,SceneContext 和一个 GameObjectContext

我认为这里发生的是它们都被安装了,但是你的 GameObjectContext 没有被添加到 SceneContext - 它一直有效直到SceneContext 实际上需要了解 GameObjectContext(您的场景测试就是这种情况)。

如果不知道什么是 IPlayer 以及您希望在那里注入(inject)什么,很难给出更精确的指示,但它没有注入(inject)到您的 SceneContext 中是有道理的,但仅在您的 GameObjectContext 中。

通过将 PlayerInstaller 放入 SceneContext 的 MonoInstallers 列表中,您在技术上解决了该问题,但这显然不是您想要的,因为它使子容器无用并打破你想要的任何分离。

相反,您需要使用外观连接两个上下文:Sub-containers and Facades: Using GameObjectContexts (解释包含一个例子,所以我引用它的部分内容没有意义,但它很详细而且很有帮助)

关于unity-game-engine - 在某些情况下,场景测试中未调用 Zenject Mono Installer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57286720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com