1

我试图在我的状态机上的某个特定时刻在运行时加载预制件。但是我在运行时遇到了这个异常。所有场景都使用 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 绑定到场景上下文。但似乎没有任何效果。我没有解决该问题的方法,一遍又一遍地阅读文档现在对我没有帮助。

注意:我不希望实际的预制件仅在实际场景中持续存在于所有场景中。但是状态机必须在所有场景中坚持。

注意:如果您需要更高的精度。问一下。;)

谢谢 !:)

4

0 回答 0