从另一个组件访问运行时分配的对象?

Accessing a runtime assigned Object from another component?

就目前而言,我似乎无法理解程序中的事件。我有两个组成部分。一个叫 EnemyMeleeSwitching 一个叫 EnemyAI.

EnemyMeleeSwitching,谁的脚本在运行时包含在与 EnemyAI 相同的父级别中,从列表中随机选择一个 Weapon(对象)并分配给 enemyWeapon对象变量 Weapon.

现在我的印象是从我的 EnemyAI 脚本访问 EnemyMeleeSwitching 组件并进一步访问 Weapon 组件应该允许我访问 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;

是的,EnemyAI 可能在分配 enemyWeapon 之前访问它。 1. 尝试将代码从 EnemyWeaponSwitching Start() 方法移到 Awake() 方法中。 要么 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);
}