当我放置此代码并按Play时,Unity 3d编辑器崩溃,您能帮我发现问题吗?

时间:2019-02-01 14:00:36

标签: c# unity3d

我正在为移动设备制作游戏,并且

我想在一个随机位置生成随机敌人,但是当我将此代码放在我的对象上并按播放时,编辑器就会崩溃。我检查了任务管理器,但看不到任何奇怪的东西

float RandX;

public GameObject[] elenco = new GameObject[5];
GameObject ciao;
int indice;
float RandxV = 2f;
Vector2 whereToSpawn;
public int nEnemy = 2;
public GameObject entrata;
public GameObject uscita;

void Start()
{
    for (int i = 0; i < nEnemy; i++)
    {
        indice = Mathf.RoundToInt(Random.Range(0f, 4.0f));
        Debug.Log(indice);
        if (indice == 2)
        {
            spawnaPortale();
        }
        else
        {
            RandX = Random.Range(-0.9f, 0.9f);
            while (RandxV == RandX)
            {
                RandX = Random.Range(-0.9f, 0.9f);
            }
            ciao = (GameObject)elenco[indice];
            whereToSpawn = new Vector2(RandX, transform.position.y);
            Instantiate(ciao, whereToSpawn, Quaternion.identity);
            RandxV = RandX;
        }
    }
}

void spawnaPortale()
{
    float entrataX;
    float entrataY;
    float uscitaX;
    float uscitaY;

    entrataX = Random.Range(-0.9f, 0.9f);
    uscitaX = Random.Range(-0.9f, 0.9f);
    float diffx = entrataX - uscitaX;
    while (diffx < 0.3f || diffx > -0.3f)
    {
        uscitaX = Random.Range(-0.9f, 0.9f);
    }
    float valori = this.transform.position.y - 0.5f;
    entrataY = Random.Range(valori, this.transform.position.y);
    uscitaY = Random.Range(valori, this.transform.position.y);
    float diffy = entrataY - uscitaY;
    while (diffy < 0.3f || diffy > -0.3f)
    {
        uscitaY = Random.Range(valori, this.transform.position.y);
    }
    Vector2 whereToSpawnEntrata = new Vector2(entrataX, entrataY);
    Vector2 whereToSpawnUscita = new Vector2(uscitaX, uscitaY);
    Instantiate(entrata, whereToSpawnEntrata, Quaternion.identity);
    Instantiate(uscita, whereToSpawnUscita, Quaternion.identity);
}

此代码应产卵随机敌人但它崩溃

2 个答案:

答案 0 :(得分:1)

问题:

spawnaPortale中,您有两个while循环,如

float diffx = entrataX - uscitaX;
while(diffx < 0.3f || diffx > -0.3f)
{
    uscitaX = Random.Range(-0.9f, 0.9f);
}

// ...

float diffy = entrataY - uscitaY;
while(diffy < 0.3f || diffy > -0.3f)
{
    uscitaY = Random.Range(valori, this.transform.position.y);
}

但是在循环内部,您从不更新 diffxdiffy的值,因此它们将始终具有相同的值,即他们在进入循环之前就已经拥有过...因此,一旦两个while条件之一true就会一直停留在true =>您永远循环。


修复:

更新while循环内的值

float diffx = entrataX - uscitaX;
while(diffx < 0.3f || diffx > -0.3f)
{
    uscitaX = Random.Range(-0.9f, 0.9f);
    diffx = entrataX - uscitaX;
}

// ...

float diffy = entrataY - uscitaY;
while(diffy < 0.3f || diffy > -0.3f)
{
    uscitaY = Random.Range(valori, this.transform.position.y);
    diffy = entrataY - uscitaY;
}

提示

如果对于diffxdiffy,则使用Math.Abs代替

float diffx = Mathf.Abs(entrataX - uscitaX);

您的while条件很容易解释:

while(diffx < 0.3f)
{ 
    ... 
}

也请注意:

请勿使用==直接比较两个浮点值!

由于single floating point precision,两个浮点值大部分时间都不相等

因此您在while中的Start条件可能从不成为true

  

浮点数不精确使得使用equals运算符比较浮点数不准确。例如,(1.0 == 10.0 / 10.0)可能不会每次都返回true。

在第一种情况下,最好先使用==,因为您首先解析为int。但是,在比较float值时,始终使用Mathf.Approximately就像

if(Mathf.Approximately(RandxV , RandX))
  

roximately()比较两个浮点数,如果两个浮点数之间的距离很小(Epsilon),则返回true。

或至少定义一个范围,在该范围内您认为两个值相等,如

if(Math.Abs(RandxV - RandX) < 0.0001f)

答案 1 :(得分:0)

这是因为您正在使用for()执行函数,但是在此函数中使用while()会导致整体崩溃。尝试使用if而不是while。这就像在update()函数中放入一个循环。