#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! Вы действительно решили для меня огромную проблему!