c# - 当我输入此代码并按播放时,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);
}
此代码应生成随机敌人,但它会崩溃
解决方案
问题:
在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)
推荐阅读
- powershell - 无法替换字符串中的“$”
- java - Period.between 不包括 Java 中的最后一天
- reactjs - 背景颜色和边框半径属性在 React Native 中无法协同工作 - Android
- android - 获取 jsonArray for 循环之外的值
- jenkins - 在管道作业中,如何使用他们选择的参数构建自由式下游作业?
- kubernetes - helm 中嵌入的 tpl 语句
- python - 在 django 中访问反向关系
- python - 将稀疏矩阵快速插入另一个矩阵
- javascript - 如何调用回调
- c# - System.InvalidOperationException:尝试激活时无法解析服务类型