Проблема с Zenject в Unity
У меня есть инсталлер который регистрирует интерфейс для фабрики и персонажа
using UnityEngine;
using Zenject;
public class GameplayInstaller : MonoInstaller
{
[SerializeField] private GameObject _prefab;
[SerializeField] private Transform _startPosition;
public override void InstallBindings()
{
BindMainCharacter();
BindEnemyFactory();
}
private void BindEnemyFactory()
{
Container.Bind<IEnemyFactory>().FromComponentInHierarchy().AsSingle();
}
private void BindMainCharacter()
{
MainCharacterMovement mainCharacter = Container
.InstantiatePrefabForComponent<MainCharacterMovement>(_prefab, _startPosition.position, Quaternion.identity, null);
Container.Bind<MainCharacterMovement>()
.FromInstance(mainCharacter)
.AsSingle()
.NonLazy();
}
}
Так же есть абстрактный класс Enemy, в котором я ожидаю что в конструкторе будет получена ссылка на персонажа и затем в старте когда в конструктор передастся текущий враг то там будет доступен _mainCharacter, используя GetMainCharacter
using UnityEngine;
using Zenject;
public abstract class Enemy : MonoBehaviour
{
private FSM _fsm;
private MainCharacterMovement _mainCharacter;
[SerializeField] private float _health;
[SerializeField] private float _attackRange;
[SerializeField] private float _speed;
public MainCharacterMovement GetMainCharacter() => _mainCharacter;
public float GetAttackRange() => _attackRange;
private void Start()
{
_fsm = new FSM();
_fsm.AddState(new FSMStateEnemyMovement(_fsm, this));
_fsm.AddState(new FSMStateEnemyAttack(_fsm, this));
_fsm.SetState<FSMStateEnemyMovement>();
}
[Inject]
private void Construct(MainCharacterMovement mainCharacter)
{
_mainCharacter = mainCharacter;
}
public void Update()
{
_fsm.UpdateState();
}
public virtual void MovementEnemy()
{
Debug.Log("Standart Movement");
}
public virtual void AttackEnemy()
{
Debug.Log("Standart Attack");
}
}
Но в FSMStateEnemyMovement, когда я пытаюсь получить главного героя в UpdateState, то получаю null, при дебаге видно, что в экземпляре класса Enemy, _mainCharacter равен null, хотя я в конструкторе получаю его
using UnityEngine;
public class FSMStateEnemyMovement : FSMState
{
private Enemy _currentEnemy;
public FSMStateEnemyMovement(FSM fsm, Enemy currentEnemy) : base(fsm)
{
_currentEnemy = currentEnemy;
}
public override void EnterState()
{
Debug.Log("Movement state [ENTER]");
}
public override void UpdateState()
{
Debug.Log("Movement state [UPDATE]");
_currentEnemy.MovementEnemy();
if (Vector2.Distance(_currentEnemy.transform.position,
_currentEnemy.GetMainCharacter().transform.position) < _currentEnemy.GetAttackRange())
_fsm.SetState<FSMStateEnemyAttack>();
}
public override void ExitState()
{
Debug.Log("Movement state [EXIT]");
}
}
Как мне корректно передать ссылку на персонажа?