我有场景A(A)和场景B(B)。B 还具有由 SceneContext 安装程序安装的 Foo AsSingle 和 NonLazy。Foo 对 Debog.Log("Hello Errors!") 实施了 IIinitialize:
yield return LoadScene("SceneA");
yield return new WaitForSeconds(2.0f);
SceneManager.LoadScene("SceneB");
yield return new WaitForSeconds(2.0f);
var newSceneContainer = ProjectContext.Instance.Container.Resolve<SceneContextRegistry>()
.SceneContexts.Single().Container;
Foo foo = newSceneContainer.Resolve<Foo>();
而且我听到“无法解析类”,而在调试中我看到了 Foo 的 hello 消息,所以安装程序已经完成了它的工作。现在,如果 Foo 是 MonoBehaviour,在一个游戏对象上,Zeneject 将其绑定为“来自场景”的组件,那么它将毫无问题地得到解决。在这种情况下,请让我知道如何解决。
**-- 编辑 -- 1 **
Foo 重命名为“BClass”。A 的安装程序为空。B的代码:
public class BInstaller : MonoInstaller
{
public override void InstallBindings()
{
Container.BindInterfacesAndSelfTo<BClass>().AsSingle().NonLazy();
}
}
public class BClass : IInitializable, IDisposable {
public void Initialize() { Debug.Log("Hello Errors!"); }
public void Dispose() { }
}
最后是测试:
public class ScenesFlow_A_to_B : SceneTestFixture
{
[UnityTest]
public IEnumerator TestScene()
{
yield return LoadScene("SceneA");
//waiting
SceneManager.LoadScene("SceneB");
//waiting
var newSceneContainer = ProjectContext.Instance.Container
.Resolve<SceneContextRegistry>().SceneContexts.Single().Container;
BClass bc = newSceneContainer.Resolve<BClass>() as BClass;
Assert.IsNotNull(bc);// fail!
}
}
-- 编辑 2 --
新变化:
public class ScenesFlow_A_to_B : SceneTestFixture
{
[UnityTest]
public IEnumerator TestScene()
{
yield return LoadScene("SceneA");
//SceneManager.LoadScene("SceneB");
yield return SceneManager.LoadSceneAsync("SceneB");
var newSceneContainer = ProjectContext.Instance.Container
.Resolve<SceneContextRegistry>().SceneContexts.Single().Container;
BClass bc = newSceneContainer.Resolve<BClass>() as BClass;
Assert.IsNotNull(bc);
}
}
结果将是这样的:
TestScene (0.323s)
---
System.InvalidOperationException : Operation is not valid due to the current state of the object
---
at System.Linq.Enumerable.Single[SceneContext] (IEnumerable`1 source) [0x00000] in <filename unknown>:0
at ScenesFlow_A_to_B+<TestScene>c__Iterator0.MoveNext () [0x00089] in ... at UnityEngine.TestTools.TestEnumerator+<Execute>c__Iterator0.MoveNext () [0x00031] in .../TestEnumerator.cs:29
---
Loading scene 'SceneA' for testing
I am class B