Unity 3D - 随机平台生成器

Unity 3D - Random Platform Generator

我目前正在使用 Unity 开发一个项目。它会生成随机的柱子作为玩家跳跃的平台。我希望它只在 Vector3.Distance(itsRandomPosition, eachOtherPillarsPosition) 大于或等于 minDisBetweenPillars 时生成一个支柱。

尝试了很多次之后,还是不行,还是会在彼此的内部生成。这是我的代码:

using UnityEngine;

public class CreateRandPlatform : MonoBehaviour
{

    public GameObject platformPrefab;
    public Transform map;

    public float minDisBetweenPillars;
    public float spawnRange;
    public float spawnRangeY;
    public int totPillars;

    private void Start()
    {
        SpawnPillars();
    }

    private bool CanSpawn(float min, Vector3 a, Vector3 b)
    {
        bool res = Vector3.Distance(a, b) >= min;
        return res == true;
    }

    private void SpawnPillars()
    {
        for (int i = 0; i < totPillars; i++)
        {
            Vector3 spawnPos = new Vector3(Random.Range(-spawnRange, spawnRange), -30, Random.Range(-spawnRange, spawnRange));
            GameObject[] pillars = GameObject.FindGameObjectsWithTag("Pillar");

            bool canSpawn = false;
            foreach (GameObject pillar in pillars)
            {
                Vector3 pillarPos = pillar.transform.position;

                if (CanSpawn(minDisBetweenPillars, spawnPos, pillarPos) == true)
                {
                    canSpawn = true;
                    break;
                }
            }

            if (canSpawn == true)
            {
                spawnPos.y = -30 + Random.Range(-spawnRangeY, spawnRangeY);
                Instantiate(platformPrefab, spawnPos, Quaternion.identity, map);
            }
            else
            {
                i--;
            }
        }
    }

}

您目前正在检查新天柱是否会超出任何一个现有天柱的范围。 你想要的是一个支票,如果它在所有现有的范围之外:

bool canSpawn = true;
foreach (GameObject pillar in pillars)
{
    Vector3 pillarPos = pillar.transform.position;

    if (!CanSpawn(minDisBetweenPillars, spawnPos, pillarPos))
    {
        canSpawn = false;
        break;
    }
}

您可能还想考虑只检查 x-z-distance。计算成本更低,我想你的支柱是 y 对齐的,这意味着 y 距离只会伪造你的结果。