Доступ к назначенному объекту времени выполнения из другого компонента?

Я не вижу смысла в событиях моей программы. У меня есть два компонента. Один называется EnemyMeleeSwitching и один называется EnemyAI,

EnemyMeleeSwitching, чей сценарий содержится на том же родительском уровне, что и EnemyAI во время выполнения выбирает случайный Weapon(объект) из списка и назначает enemyWeapon переменная объекта как таковая Weapon,

Теперь у меня сложилось впечатление, что доступ к EnemyMeleeSwitching компонент и далее Weapon компонент из моего EnemyAI Скрипт должен позволить мне затем получить доступ enemyWeapon Однако я получаю NullReferenceException,

Это как-то связано с порядком исполнения? Мой EnemyAI скрипт пытается получить доступ enemyWeapon прежде чем он был назначен?

EnemyMeleeSwitching Код ниже:

public class EnemyWeaponSwitching : MonoBehaviour 
{
    public Weapon enemyWeapon;
    public Weapon weapon01;
    public Weapon weapon02;

    private List<Weapon> weapons = new List<Weapon>();

    void Start()
    {
        weapons.Add(weapon01);
        weapons.Add(weapon02);

        enemyWeapon = weapons[Random.Range(0, weapons.Count)];

        foreach (Weapon weapon in weapons)
        {
            weapon.SetActive(false);
        }

        enemyWeapon.SetActive(true);
    }
}

EnemyAI Код звонка ниже:

weapon = (Weapon)gameObject.GetComponent<EnemyWeaponSwitching>().enemyWeapon;

2 ответа

Решение

В продолжение моего вопроса мне удалось решить эту проблему, переместив код из Start() к новой функции, которую я вызвал после установления ссылки на EnemyWeaponSwitching, Это присвоило требуемую переменную объекта, прежде чем я затем вызвал ее в моем EnemyAI код.

Новый код ниже:

(EnemyAI)

weaponSwitching = gameObject.GetComponentInChildren<EnemyWeaponSwitching>();
        weaponSwitching.GenerateWeapon();

        attackRange = weaponSwitching.enemyWeapon.maxAttackRange;

(EnemyWeaponSwitching)

public void GenerateWeapon()
{
    weapons.Add(weapon01);
    weapons.Add(weapon02);

    enemyWeapon = weapons[Random.Range(0, weapons.Count)];

    foreach (Weapon weapon in weapons)
    {
        weapon.SetActive(false);
    }

    enemyWeapon.SetActive(true);
}

Да, возможно, что EnemyAI получает доступ к вражескому оружию до его назначения. 1. Попробуйте переместить свой код из метода EnemyWeaponSwitching Start() в метод Awake(). Или 2. Попробуйте изменить порядок выполнения или ваши сценарии.

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