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 距离只会伪造你的结果。
我目前正在使用 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 距离只会伪造你的结果。