【问题标题】:NullReferenceException when trying to use a foreach on an Interface尝试在接口上使用 foreach 时出现 NullReferenceException
【发布时间】:2013-03-20 00:34:22
【问题描述】:

这是我在 Unity 3D 中的 C# 代码:

private List<IEnemy> Enemies;

void Start () {
    soldier = OT.AnimatingSprite("PlayerAnimatingSprite");

    Bomber bomber = new Bomber(soldier);
    Enemies.Add(bomber as IEnemy);
}

void Update () {        
    ProcessEnemies();       
}

void ProcessEnemies()
{
    foreach(IEnemy enemy in Enemies)
    {
        enemy.Move();
    }
}

当我在上面的代码中实例化 Bomber 时,我也会收到以下警告: “您正在尝试使用 'new' 关键字创建 MonoBehavior。这是不允许的。只能使用 AddComponent() 添加 MonoBehavior。”

【问题讨论】:

    标签: c# foreach unity3d


    【解决方案1】:

    敌人对象尚未初始化

    private List<IEnemy> Enemies = new List<IEnemy>();
    

    【讨论】:

    • 在这种情况下你需要它,因为 IEnemy 似乎是一个接口。如果它作为本机类型或标记为 Serializable Unity(或 Mono/.Net?)的类为您执行此操作。
    【解决方案2】:

    AnteSim 的答案解决了一个问题,但您得到的实际错误来自尝试在 Bmber 上调用“新”,我认为它是 GameObject 或 MonoBehaviour 组件。

    如果 Bomber 是一个组件:

    Bomber b = gameObject.AddComponent<Bomber>();
    Enemies.Add(b);
    

    如果 Bomber 是一个游戏对象:

    GameObject b = Instantiate(Bomber, Vector3.zero, Quaternion.identity) as GameObject;
    Enemies.Add(b);
    

    【讨论】:

    • 如果您使用 GetComponent 的通用形式,"as Bomber" 是多余的。 AddComponent 也不是像 GetComponent 那样的 Component 方法。
    • Ack,总是忘记 AddComponent 上的游戏对象。
    猜你喜欢
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    相关资源
    最近更新 更多