Как исправить исключение: 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: если вам нужно больше точности. Просто спроси.;)
Спасибо!:)