Как исправить исключение: ZenjectException: невозможно разрешить тип "A" при создании объекта с типом "B". Граф объекта: B

Я пытаюсь загрузить префаб во время выполнения в определенный момент на моем автомате. Но я получаю это исключение во время выполнения. Все сцены подтверждаются с помощью сочетания клавиш 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>();
        }
    }
}

Состояние создается с помощью функции CreateState в классе AVFFactory. Нет проблем создания состояний и навигации между ними, когда захочу. За исключением случаев, когда я пытаюсь загрузить сборный, содержащий контекст игрового объекта. Итак, я понимаю, что все управление конечным автоматом существует только в контексте проекта.

Я установил в установщик контекста сцены привязку фабрик моих префабов:

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 в свой префаб, добавляю в него AVFS и boxPedestal и также добавляю в него контекст проекта. Но это не работает.

Я пытаюсь создать фабрику вне класса AVFSandboxPedestal и связать ее с контекстом проекта с помощью компонента Zenject Binding. (Но я разрешил привязку в установщике в контексте сцены во время сцены. Может быть, это не вызывает ошибку, но она одна), чтобы связать класс AVFSandboxPedestal с контекстом сцены. Но ничего не работает. У меня нет решений для этой проблемы, и чтение документации снова и снова не помогает мне прямо сейчас.

NB: я не хочу, чтобы настоящий сборный сохранялся во всех сценах только в реальной сцене. Но государственная машина должна сохраняться на всех сценах.

NB: если вам нужно больше точности. Просто спроси.;)

Спасибо!:)

0 ответов

Другие вопросы по тегам