Unity 在函数调用后崩溃。是数组索引错误吗? [复制]
Posted
技术标签:
【中文标题】Unity 在函数调用后崩溃。是数组索引错误吗? [复制]【英文标题】:Unity crashes after a function call. Is it an Array Index fault? [duplicate] 【发布时间】:2021-05-23 17:04:00 【问题描述】:我想不出更好的标题。 我基本上想在一个特定长度的数组中添加从 0 到 4 的随机数,最小 1,最大 5,这是在第一个 for 循环中。第二个 for 循环实例化了一些可以正常工作的对象。 所以我做的是这样的:
private void Inst_Asteroid()
for (int i = 0; i < _asteroidPathsArray.Length; i++)
int path = Random.Range(0, 5);
while(System.Array.IndexOf(_asteroidPathsArray, path) >= 0)
path = Random.Range(0, 5);
_asteroidPathsArray[i] = path;
foreach (int path in _asteroidPathsArray)
_asteroidPos = new Vector3(_spaceship._statePos[path].x, _spaceship._statePos[path].y, 1000);
Instantiate(prefabAsteroid, _asteroidPos, Quaternion.identity);
我以前做过_asteroidPathsArray = new int[asteroidPaths];
。当asteroidPaths
(数组长度)等于 5 时,它会崩溃。我希望它在 1 到 5 的范围内工作。使用此代码它适用于 1 到 4。我看不出我的错误。
我很高兴感谢任何帮助和建设性的批评。
【问题讨论】:
另见***.com/questions/108819/… 仅供参考,“崩溃”通常意味着异常。此异常包含有关问题的重要信息。请分享确切的消息 【参考方案1】:Random.Range(0, 5)
Unity documentation,从 0,1,2,3,4 创建数字
示例net fiddle here 将有助于解释这一点:
小提琴输出
i:0 path:4
i:1 path:1
i:2 path:3
i:3 path:2
Fatal Error: Execution time limit was exceeded
但是还是有0。为什么0从来没有插入?因为在 c# 中所有整数值都用 0 初始化。因此,当您的Random.Range
返回 0 时,索引已经存在,while 循环将永远执行。
像这样初始化你的数组,你应该可以正常运行:
int[] _asteroidPathsArray = new int[5] -1,-1,-1,-1,-1;
【讨论】:
因为我每次都用不同的长度初始化数组。我通常像以前一样对其进行初始化,但之后将数组中的每个值都更改为 -1。但它不起作用。我不能给你任何错误表达式,因为 Unity 只是冻结了。 如何初始化数组?请分享代码。public int asteroidPaths = 3;
_asteroidPathsArray = new int[asteroidPaths];
for(int i = 0; i < _asteroidPathsArray.Length; i++)
_asteroidPathsArray[i] = -1;
【参考方案2】:
除了this answer
看起来你真正想要的只是随机顺序的数字 0 到 4。
你可以使用例如
using System.Linq;
...
_asteroidPathsArray = Enumrable.Range(0,5).OrderBy(UnityEninge.Random.value).ToArray();
或者直接
private void Inst_Asteroid()
foreach(var path in Enumrable.Range(0,5).OrderBy(UnityEninge.Random.value))
var statePos = _spaceship._statePos[path];
var asteroidPos = new Vector3(statePos.x, statePos.y, 1000);
Instantiate(prefabAsteroid, asteroidPos, Quaternion.identity);
请注意,尽管在这里进行随机化绝对没有用 .. 因为无论如何您一次就遍历了整个数组... 为什么不简单地按顺序使用它们呢?
在我看来,这不会有什么不同:
private void Inst_Asteroid()
for(var path = 0; path < 5; path++;)
var statePos = _spaceship._statePos[path];
var asteroidPos = new Vector3(statePos.x, statePos.y, 1000);
Instantiate(prefabAsteroid, asteroidPos, Quaternion.identity);
【讨论】:
以上是关于Unity 在函数调用后崩溃。是数组索引错误吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章