Unity 在播放时冻结

Unity freezes on Play

我一直在制作这个 enemy generator,它在 Start() 上被调用并且大部分时间都冻结。有时它让我们玩一次,但当我第二次点击播放时,它就冻结了,需要重新启动统一。 独立版本无法解决问题。 记录最后几行:

UnityEngine.DebugLogHandler:Internal_Log(LogType, LogOption, String, Object)
UnityEngine.DebugLogHandler:LogFormat(LogType, Object, String, Object[])
UnityEngine.Logger:Log(LogType, Object)
UnityEngine.Debug:Log(Object)
EnemyGenerator:Start() (at Assets\Scripts\Utils\EnemyGenerator.cs:23)

(Filename: Assets/Scripts/Utils/EnemyGenerator.cs Line: 23)

这是我的脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyGenerator : MonoBehaviour
{
    public List<GameObject> camps;
    public List<GameObject> enemies;
    int threshold;


public List<GameObject> campAreas;
public List<GameObject> enemyAreas;

public int campsToSpawn;
public int enemiesPerAreaMin;
public int enemiesPerAreaMax;

void Start()
{
    for (int i = 0; i < campsToSpawn; i++)
    {
        threshold = Random.Range(0, camps.Count - 1);
        Debug.Log(threshold);
        var campPlace = Random.Range(0, campAreas.Count - 1);
        var camp = Instantiate(camps[threshold], campAreas[campPlace].transform.position, Quaternion.identity);
        if (camp != null)
        {
            campAreas.RemoveAt(campPlace);
        }
    }
    Debug.Break();
    bool canSpawn = true;

    for (int i = 0; i < enemyAreas.Count; i++)
    {
        threshold = Random.Range(0, enemies.Count - 1);
        List<GameObject> enemiesSpawned = new List<GameObject>();
        var enemyCount = Random.Range(enemiesPerAreaMin, enemiesPerAreaMax);
        for (int j = 0; j < enemyCount; j++)
        {
            var pos = new Vector3(Random.Range(enemyAreas[i].GetComponent<BoxCollider>().bounds.min.x, enemyAreas[i].GetComponent<BoxCollider>().bounds.max.x), enemyAreas[i].transform.position.y,
                    Random.Range(enemyAreas[i].GetComponent<BoxCollider>().bounds.min.z, enemyAreas[i].GetComponent<BoxCollider>().bounds.max.z));
            if (enemiesSpawned.Count == 0)
            {
                GameObject en = null;
                enemiesSpawned.Add(en = Instantiate(enemies[threshold], pos, Quaternion.identity));
            }
            else
            {
                for (int x = 0; x < enemiesSpawned.Count; x++)
                {
                    if (Vector3.Distance(enemiesSpawned[x].transform.position, pos) < 3f)
                    {
                        canSpawn = false;
                    }
                }
                if (!canSpawn)
                {
                    j--;
                }
                else
                {
                    enemiesSpawned.Add(Instantiate(enemies[threshold], pos, Quaternion.identity));
                }
            }
        }
        Debug.Break();
    }
}
}

我试图找到真正会永远循环的东西,但我认为这不是问题所在。想知道这是否可能是性能泄漏?

提前致谢。

对不起,虽然这是 Debug.Break();

的问题

这可能是问题所在

           {
               for (int x = 0; x < enemiesSpawned.Count; x++)
               {
                   if (Vector3.Distance(enemiesSpawned[x].transform.position, pos) < 3f)
                   {
                       canSpawn = false;
                   }
               }
               if (!canSpawn)
               {
                   j--;
               }
               else
               {
                   enemiesSpawned.Add(Instantiate(enemies[threshold], pos, Quaternion.identity));
               }
           }
You getting a random position inside a certain bounds. If the position is too close u don't spawn and --j; to retry a new position. So if for some reason the bounds are wrong or barely engouth you might be running that function for a very long time.

A quick test is to add a counter before your j for loop.


int debugCounter = 0;
for (int j = 0; j < enemyCount; j++)
       {
//at the very top
++debugCounter;
if(debugCounter > 100)//or a bigger number
{
Debug.Log("Too many attemps");
break;
}
...