首页 > 解决方案 > 当我输入此代码并按播放时,unity 3d 编辑器崩溃,你能帮我找到问题吗?

问题描述

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

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

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);
}

此代码应生成随机敌人,但它会崩溃

标签: c#unity3d

解决方案


问题:

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);
}

但是在循环内部,您永远不会更新的值,diffx因此diffy它们将始终具有相同的值-即它们在进入循环之前所具有的值...因此,一旦这两个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;
}

暗示

如果你使用Math.Absdiffx​​ 而不是喜欢diffy

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

您的while条件更容易解释:

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

另请注意:

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

由于单浮点精度,两个浮点值大部分时间不相等

所以你的while情况Start可能永远不会true

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

在第一个条件下,使用它是可以的,==因为您int首先解析。但是在比较float值时总是使用Mathf.Approximately 之类的

if(Mathf.Approximately(RandxV , RandX))

Similar() 比较两个浮点数,如果它们在彼此的小值 (Epsilon) 内,则返回 true。

或者至少定义一个您认为两个值相等的范围,例如

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

推荐阅读