Проблема с 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]");
    }
}

Как мне корректно передать ссылку на персонажа?


Ответы (0 шт):