我正在为移动设备制作游戏,并且
我想在一个随机位置生成随机敌人,但是当我将此代码放在我的对象上并按播放时,编辑器就会崩溃。我检查了任务管理器,但看不到任何奇怪的东西
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);
}
此代码应产卵随机敌人但它崩溃
答案 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);
}
但是在循环内部,您从不更新 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;
}
提示
如果对于diffx
和diffy
,则使用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()函数中放入一个循环。