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 &lt; _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 在函数调用后崩溃。是数组索引错误吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Bugly能监测到UNITY3D的崩溃信息吗

Hive 通用 UDTF 因数组索引超出范围错误而失败

Unity3d在屏幕范围内随机生成一个圆

Unity数组,获取当前索引-x或+x [重复]

Unity崩溃报告自动处理工具:Crash Analyzer

Unity C# - 数组索引超出范围