2

就目前而言,我似乎无法理解程序中的事件。我有两个组件。一呼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;
4

2 回答 2

1

是的,EnemyAI 有可能在分配前访问enemyWeapon。1. 尝试将代码从 EnemyWeaponSwitching Start() 方法移到 Awake() 方法中。或者 2. 尝试更改执行顺序或您的脚本。

于 2015-02-19T06:17:06.333 回答
0

作为对我的问题的跟进,我设法通过将代码从一个新函数移动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);
}
于 2015-02-19T06:34:35.517 回答