关于实例化的建议?

Advice on Instantiation?

这是我在 Stack Overflow 上的第一个问题。我是一个编码新手,所以请多多包涵我和我可怕的代码。

void ChickenInstantiate()
    {
        LocOfChkn.Add(spawnLoc);
        int i = 0;
        for (int ChickenCount = 0; ChickenCount < maxChickenCount; ChickenCount++)
        {
            while (Vector3.Distance(spawnLoc, LocOfChkn[i]) < 2)
            {
                spawnLoc = new Vector3(Random.Range(randXMin, randXMax), Random.Range(randYMin, randYMax), 1);
                spawnLoc.z = 5;
                i += 1;
                if (i >= LocOfChkn.Count)
                {
                    break;
                }
            }
            Instantiate(ChickenPrefab1, spawnLoc, Quaternion.identity);
            LocOfChkn.Add(spawnLoc);
            i = 0;
        }
    }

这是一些用于安装预制件但确保它不会在某个区域内实例化的代码,坦率地说,我不确定我应该如何修复它 - 它完全损坏了;鸡没有出现,我什至不确定它们是否在正确的区域生成等。(spawnLoc 的第一个实例是在启动时定义的,顺便说一句)

我正在使用当前最新版本的 unity 和 visual studio。

  • 您应该 Instantiate 一只鸡作为您添加到 locOfChkn 的第一个位置。这既可以确保您的代码是 运行,又可以避免无鸡的地方。

  • 使用 VSCode 或您最喜欢的 IDE 对您的功能进行逐步评估,以准确了解发生了什么。除此之外,为每个步骤添加 Debug.Logs。

  • 检查任何生成的鸡的层次结构。也许他们是残疾人。

现在解决其他问题:

  • 请遵循 C# 编写代码的惯例。 Chkn 和 Loc 几乎不直观。

  • 如果在计算距离时忽略z位置,请考虑使用Vector2.Distance。

  • 将字段用于仅在一个函数内使用的值是无用的。只需将 spawnLoc 设置为 ChickenInstantiate.

  • 中的 var

这是您的代码的清理版本

void InstantiateChicken()
{
    List<Vector3> chickenPositions = new List<Vector3>();

    for (int i = 0; i < maxChickenCount; i++)
    {
        bool doesCollide;
        Vector3 spawnLocation;
        do
        {
            spawnLocation = new Vector3(
                Random.Range(randXMin, randXMax),
                Random.Range(randYMin, randYMax),
                5);
            doesCollide = false;
            foreach (var pos in chickPositions)
            {
                if (Vector2.Distance(pos, spawnLocation) < 2f)
                    doesCollide = true;
            }
        }
        while (doesCollide);

        Instantiate(chickenPrefab1, spawnLocation, Quaternion.identity);
        chickenPositions.Add(spawnLocation);
    }
}

或者,只需手动放置所有的鸡,并让它们在产卵时通过随机因素偏移它们的位置。