有关实例化的建议?

问题描述 投票:1回答:1

这是我关于堆栈溢出的第一个问题。我是编码新手,所以请忍受我和我可怕的代码。

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的第一个实例是在启动时定义的,btw)

我使用的是Unity和Visual Studio的最新版本。

c# unity3d instantiation
1个回答
0
投票
  • 您应该在添加到Instantiate的第一个位置上locOfChkn一只鸡。这既可以确保您的代码正在运行,又可以避免出现混乱的情况。

  • 使用VSCode或您最喜欢的IDE对功能进行逐步评估,以确切了解正在发生的情况。除非每步都添加Debug.Log

  • 检查所有产卵鸡的等级。也许他们被禁用了。

现在有其他问题:

  • 请遵循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);
    }
}

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

© www.soinside.com 2019 - 2024. All rights reserved.