Unity3d Unity-CheckSphere不工作?产卵仅在设备上冻结?

Unity3d Unity-CheckSphere不工作?产卵仅在设备上冻结?,unity3d,physics,augmented-reality,arkit,spawn,Unity3d,Physics,Augmented Reality,Arkit,Spawn,我试图在一个不断变化的区域(一个平面,ARKit)内生成一组立方体,并且不让它们重叠。我认为这很简单,我在Unity editor中的工作如下: 我的问题是部署到设备(iPhone),一切都不一样。有几件事不起作用,我不知道为什么——这是一个相对简单的脚本。首先,我认为CheckSphere不起作用,比例有所不同——但这就是我试图获得一个空白空间的方式: public Vector3 CheckForEmptySpace (Bounds bounds) { float

我试图在一个不断变化的区域(一个平面,ARKit)内生成一组立方体,并且不让它们重叠。我认为这很简单,我在Unity editor中的工作如下:

我的问题是部署到设备(iPhone),一切都不一样。有几件事不起作用,我不知道为什么——这是一个相对简单的脚本。首先,我认为CheckSphere不起作用,比例有所不同——但这就是我试图获得一个空白空间的方式:

public Vector3 CheckForEmptySpace (Bounds bounds)
    {
        float sphereRadius = tierDist;
            Vector3 startingPos = new Vector3 (UnityEngine.Random.Range(bounds.min.x, bounds.max.x), bounds.min.y, UnityEngine.Random.Range(bounds.min.z, bounds.max.z));
                // Loop, until empty adjacent space is found
                var spawnPos = startingPos; 
                while ( true )
                {
            if (!(Physics.CheckSphere(spawnPos, sphereRadius, 1 << 0)) )   // Check if area is empty
                        return spawnPos;    // Return location
                    else
                    {
                        // Not empty, so gradually move position down. If we hit the boundary edge, move and start again from the opposite edge.
                        var shiftAmount = 0.5f;
                        spawnPos.z -= shiftAmount;

                    if ( spawnPos.z < bounds.min.z )
                        {
                            spawnPos.z = bounds.max.z;
                            spawnPos.x += shiftAmount;

                    if ( spawnPos.x > bounds.max.x )
                        spawnPos.x = bounds.min.x;

                        }
                        // If we reach back to a close radius of the starting point, then we didn't find any empty spots
                        var proximity = (spawnPos - startingPos).sqrMagnitude;
                        var range = shiftAmount-0.1;    // Slight 0.1 buffer so it ignores our initial proximity to the start point
                        if ( proximity < range*range )  // Square the range
                        {
                            Debug.Log( "An empty location could not be found" );
                            return new Vector3 (200, 200, 200); 
                        }
                    }
                }
    }
到底发生了什么-为什么它只会在这样的设备上冻结?

摘要:

听起来你需要在每一次产卵之间留一小段间隔

(顺便说一句,一个有用的技巧是,学习如何等到下一帧-查看许多关于它的文章。)


一直以来都是这个问题的经典答案

  • 进入随机算法的“分块”

  • 请注意“如何获得唯一随机数集”中的方便代码行

享受


无关问题-

您是否需要在生成每个多维数据集之间等待一小段时间?

在unity中的一段时间,它非常简单地
调用
——您的代码模式如下所示:

目前

for 1 to 100 .. spawn a cube
在每段时间之间暂停

一开始

Call Invoke("_spawn", 1f)
然后

func _spawn() {
   if count > 70 .. break
   spawn a cube
   Invoke("_spawn", 1f)
}
类似示例代码-
更简单的是-


好好享受吧。。非常感谢。问题是,在实施之前,我认为iPhone仍然会因为一些内存问题而停滞不前。。如果im最多只能生成20个多维数据集,有没有办法让现有代码正常工作?此外,所有多维数据集大小相同,需要等待一段时间。。我现在唯一的问题是检查球体并没有真正工作-它们都是在彼此的上面繁殖的。这是现实世界中ARKit/iphone普遍存在的问题吗?很高兴我们在@skyguy解决了这个问题。关于“同一个spot-AR问题”,你真的需要问一个新问题。注意:添加一些非常简单的语句“Debug.Log..”来发现发生了什么。通常情况下,有些东西的循环比你想象的要多。输入越来越多的Debug.Log语句,直到看到问题!
for 1 to 100 .. spawn a cube
Call Invoke("_spawn", 1f)
func _spawn() {
   if count > 70 .. break
   spawn a cube
   Invoke("_spawn", 1f)
}