Unity 3D — Генератор случайных платформ

#c# #unity3d #random #generator

#c# #unity3d #Случайный #генератор

Вопрос:

В настоящее время я работаю над проектом в 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--;
            }
        }
    }

}

  

Ответ №1:

в данный момент вы проверяете, будет ли новый компонент находиться за пределами диапазона ЛЮБОГО из существующих. Что вы хотите, так это проверить, находится ли он за пределами диапазона ВСЕХ существующих:

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

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

Также вы можете подумать только о проверке расстояния x-z. Расчет дешевле, и я полагаю, что ваши столбы выровнены по y, что означает, что расстояние y только фальсифицирует ваш результат.

Комментарии:

1. Большое тебе спасибо @Thomas! Вы действительно решили для меня огромную проблему!