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

时间:2015-02-19 03:55:35

标签: unity3d runtime nullreferenceexception assign unity-components

目前我似乎无法理解我的计划中的事件。我有两个组成部分。一个名为EnemyMeleeSwitching,一个名为EnemyAI

EnemyMeleeSwitching,其运行时脚本与EnemyAI包含在同一父级别中,从列表中选择一个随机Weapon(对象)并分配{{1}对象变量为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

2 个答案:

答案 0 :(得分:1)

是的,EnemyAI有可能在分配之前访问敌方武器。 1.尝试从Awake()方法中的EnemyWeaponSwitching Start()方法移动代码。 要么 2.尝试更改执行顺序或脚本。

答案 1 :(得分: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);
}