我试图在我的状态机上的某个特定时刻在运行时加载预制件。但是我在运行时遇到了这个异常。所有场景都使用 Ctrl Left+Maj Left+V 快捷键进行验证。
问题的背景
我的状态机绑定到项目上下文中:
using Zenject;
namespace AVF.StateMachine
{
/**
* @class AVFStateMachineInstaller
* Class used to represent the installer of the state machine
*/
public class AVFStateMachineInstaller : MonoInstaller<AVFStateMachineInstaller>
{
/**
* Install the bindings between the objects
*/
public override void InstallBindings()
{
// Global factory
Container.Bind<AVFStateFactory>().AsSingle();
// States factories
Container.BindFactory<AVFInitState, AVFInitState.Factory>().WhenInjectedInto<AVFStateFactory>();
Container.BindFactory<AVFLoginState, AVFLoginState.Factory>().WhenInjectedInto<AVFStateFactory>();
Container.BindFactory<AVFSelectJobState, AVFSelectJobState.Factory>().WhenInjectedInto<AVFStateFactory>();
}
}
}
状态是使用 AVFFactory 类中的函数 CreateState 创建的。创建状态并在需要时在它们之间导航没有问题。除非我尝试加载包含游戏对象上下文的预制件。所以,我知道状态机的所有管理只存在于项目上下文中。
我在场景上下文的安装程序中放置了我的预制工厂的绑定:
using UnityEngine;
using Zenject;
using AVF.StateMachine;
public class AVFSceneHubInstaller : MonoInstaller<AVFSceneHubInstaller>
{
[SerializeField]
GameObject mPrefabWeldingPedestal;
[SerializeField]
GameObject mPrefabSandboxPedestal;
public override void InstallBindings()
{
Container.BindFactory<AVFSandboxPedestal, AVFSandboxPedestal.Factory>().FromSubContainerResolve().ByNewPrefab(mPrefabSandboxPedestal).WhenInjectedInto<AVFSelectJobState>();
Container.BindFactory<AVFWeldingPedestal, AVFWeldingPedestal.Factory>().FromSubContainerResolve().ByNewPrefab(mPrefabWeldingPedestal).WhenInjectedInto<AVFSelectJobState>();
}
}
我的预制件包含一个带有安装程序的游戏对象上下文:
using UnityEngine;
using Zenject;
public class AVFSandboxPedestalInstaller : MonoInstaller
{
[SerializeField]
private GameObject mPrefab;
[SerializeField]
private GameObject mAttachObject;
public override void InstallBindings()
{
Container.BindInterfacesAndSelfTo<AVFSandboxPedestal>()
.FromComponentInNewPrefab(mPrefab)
.UnderTransform(mAttachObject.transform)
.AsSingle();
}
}
以及用于将对象与工厂一起使用的组件:
using UnityEngine;
using VRTK;
using Zenject;
public class AVFSandboxPedestal : VRTK_InteractableObject
{
public void Start()
{
Debug.LogWarning("HELLO SANDBOX");
}
public override void OnInteractableObjectUsed(InteractableObjectEventArgs e)
{
base.OnInteractableObjectUsed(e);
Debug.LogWarning(gameObject.name + "USED");
}
public class Factory : Factory<AVFSandboxPedestal>
{
}
}
我需要工厂实例的状态就是这样,当我想创建这个对象时,我遇到了异常,因为它无法解析类型 AVFSandboxPedestal.Factory :
using UnityEngine;
using Zenject;
using Mimbus.StateMachine;
using AVF.Context;
namespace AVF.StateMachine
{
/**
* @class AVFSelectJobState
* Class used to represent the select job state of the application
*/
public class AVFSelectJobState : MbStateEntity
{
// Class fields
private readonly AVFStateManager mStateManager; /**< The state manager */
private readonly AVFContext mContext; /**< Context of the application */
private readonly AVFHeadState mHeadState; /**< Common state of all states and scenes */
private readonly AVFSandboxPedestal.Factory mSandboxPedestalFactory; /**< */
/**
* Constructor
* @param[in] pStateManager The state manager of the application
* @param[in] pContext The context of the application
*/
public AVFSelectJobState(AVFStateManager pStateManager, AVFContext pContext, AVFHeadState pHeadState,
AVFSandboxPedestal.Factory pSandboxPedestalFactory)
{
this.mStateManager = pStateManager;
this.mContext = pContext;
this.mHeadState = pHeadState;
this.mSandboxPedestalFactory = pSandboxPedestalFactory;
}
/**
* Initialize this object
*/
public override void Initialize()
{
Debug.Log("Select job state start");
this.mSandboxPedestalFactory.Create();
}
// Other lines of code .....
我已经尝试过的
我认为问题是:我将我的状态机和状态放入项目上下文中,并将我的预制件放入他自己的上下文中。所以,显然,它不能工作。(不?)
所以我尝试在我的预制件上添加一个 Zenject Binding 组件,我在其中添加了 AVFSandboxPedestal 并在其中添加了项目上下文。但它不起作用。
我尝试在类 AVFSandboxPedestal 之外创建一个工厂,并使用组件 Zenject Binding 将其绑定到项目上下文。(但是我在场景时在场景上下文中的安装程序中进行了绑定。也许它不会引发错误,但它是一个),将类 AVFSandboxPedestal 绑定到场景上下文。但似乎没有任何效果。我没有解决该问题的方法,一遍又一遍地阅读文档现在对我没有帮助。
注意:我不希望实际的预制件仅在实际场景中持续存在于所有场景中。但是状态机必须在所有场景中坚持。
注意:如果您需要更高的精度。问一下。;)
谢谢 !:)