【问题标题】:Spawning enemies in Unity 2D在 Unity 2D 中生成敌人
【发布时间】:2017-11-11 16:37:01
【问题描述】:

我想让我的敌人在旋转时使用“spawn”从顶部出现。

但是我收到了这个错误:

IndexOutOfRangeException:数组索引超出范围。 spawnScript.addEnemy () (在 Assets/Scripts/spawnScript.cs:21)

下面是我的脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class spawnScript : MonoBehaviour {

public Transform[] spawnPoints;
public GameObject enemy;
public float spawnTime = 5f;
public float spawnDelay = 3f; 

// Use this for initialization
void Start () {
    InvokeRepeating ("addEnemy", spawnDelay, spawnTime);

}

void addEnemy() {
    // Instantiate a random enemy.
    int spawnPointIndex = Random.Range(0, spawnPoints.Length);
    Instantiate (enemy, spawnPoints[spawnPointIndex].position, spawnPoints[spawnPointIndex].rotation);
}

// Update is called once per frame
void Update () {

}
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    这里有问题:public Transform[] spawnPoints;

    spawnPoints 变量被声明为 public,这意味着您想通过编辑器填充它。您没有这样做,大小仍然是 0。当大小为0 时,Random.Range 将执行此操作Random.Range(0,0) 并返回0。当您将0 作为spawnPoints 变量的索引提供时,它会抛出该错误,因为spawnPoints 中没有任何内容。您必须设置大小。

    这就是现在的样子:

    它应该是这样的:

    请注意我是如何在第二个屏幕截图中将变换拖到 spawnPoints 数组槽的。如果您不这样做,预计会收到 NullException 错误。

    如果您不想在不设置大小的情况下出现该错误,请在使用之前检查是否为spawnPoints.Length > 0

    if (spawnPoints.Length > 0)
    {
        int spawnPointIndex = UnityEngine.Random.Range(0, spawnPoints.Length);
        Instantiate(enemy, spawnPoints[spawnPointIndex].position, spawnPoints[spawnPointIndex].rotation);
    }
    

    通过将spawnPoints 设为public,假设您想从编辑器中设置size。您还可以从脚本中设置size,但首先将其设置为private 变量,这样您就不会遇到问题:

    void Start()
    {
        //Set the size to 3 then fill it up
        spawnPoints = new Transform[3];
        spawnPoints[0] = yourPint1;
        spawnPoints[1] = yourPint2;
        spawnPoints[2] = yourPint3;
    }
    

    【讨论】:

    • 谢谢!我修改了我的脚本,但收到了以下 2 个错误: 断言失败:TLS 分配器 ALLOC_TEMP_THREAD,底层分配器 ALLOC_TEMP_THREAD 有未释放的分配 UnityEditor.AssetModificationProcessorInternal:OnWillSaveAssets(String[], String[]&, String[]&, Int32) Assets/Scripts/ spawnScript.cs(18,20): 错误 CS0029: 无法隐式转换类型string' to UnityEngine.Transform'
    • 嗨,我的回答没有什么复杂的。您甚至不必修改代码,因此请使用您问题中的原始代码。 只需像我在答案的第二个屏幕截图中所做的那样更改大小即可。.
    • 嗨,我猜对了 :) 谢谢!但是我的敌人只是出现 1 并且是静态的。但是,我可以看到克隆在那里,但它们没有出现在我的游戏中。你对此有什么想法吗?
    • 那是完全不同的问题。当您的问题得到回答和解决后,您accept 回答然后就您的新问题提出 问题。这个答案只是在这里回答您问题中的错误,而不是解决您的整个程序问题。确保提供足够的详细信息以帮助您解决新问题
    • @MariamSyafiqahSaidi 您应该接受答案(在左上角,您可以看到一个可按的图标),以便将问题标记为其他用户已解决
    【解决方案2】:

    此处出错 - int spawnPointIndex = Random.Range(0, spawnPoints.Length);

    你应该写 - Random.Range(0, spawnPoints.Length - 1)

    【讨论】:

    • 亲爱的,我已经修改了我的脚本,但仍然出现同样的错误。您对我的脚本错误有任何其他想法吗?谢谢! :)
    • @dlarukov 它与Random.Range 无关,提供spawnPoints.Length 实际上是正确的方法而不是spawnPoints.Length - 1,因为Random 函数的第二个参数是独占的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多