【发布时间】:2019-12-24 14:18:26
【问题描述】:
我有一个游戏,我在每个关卡开始时生成许多对象。我有一个“完成孔”和一些其他大的圆形“陷阱”孔,它们也出现在关卡中。使用递归,我尝试在没有其他孔的位置随机生成我的完成孔。我正在尝试使用 OverlapSphere 来查找该区域中的对象。如果随机位置有洞,它会重新运行该方法以分配随机位置。我不希望终点洞重叠,因为那样玩家可能无法到达终点洞。
我尝试重做我的代码,调整 OverlapSphere 参数以使检查区域更大或更小,但这似乎并不能解决问题。事实上,当我把它改得太精确时,它会因为它的递归性质而卡住并导致崩溃。
下面是我在关卡生成器脚本的 Start 方法中调用时的代码。
void Start()
{
GenerateLevel();
}
private void RandomiseFinishHolePos()
{
float _randomRangeX = Random.Range(-.75f, 4.75f);
float _randomRangeZ = Random.Range(2f, 9f);
FinishHolePosition = new Vector3(_randomRangeX, 0.1f, _randomRangeZ);
holeColliders = Physics.OverlapSphere(FinishHolePosition, 2f, 1 << 11);
if (holeColliders.Length != 0)
{
Debug.Log("Collider found: " + holeColliders[0].name);
RandomiseFinishHolePos();
}
}
private void CreateFinishHole()
{
RandomiseFinishHolePos();
if (FinishHoleActive == null)
{
FinishHoleActive = Instantiate(FinishHole, FinishHolePosition, Quaternion.identity);
Debug.Log("Finish hole is NULL. " + FinishHolePosition);
FinishHoleSpawn = FinishHoleActive.GetComponentInChildren<ParticleSystem>();
}
else
{
FinishHoleActive.transform.position = FinishHolePosition;
Debug.Log("Finish hole is NOT null. " + FinishHolePosition);
FinishHoleSpawn.Play();
}
有时当它运行它检测位置之间重叠的方法时,然后将完成孔放置在一个没有物体的新随机位置。但是,它仍然经常失败,这使得关卡无法完成,因为完成孔将在另一个对象的顶部。
希望有另一种方法来实现这一目标,因为这种方法可能受到 OverlapSphere 和递归的限制。感谢阅读。
【问题讨论】:
-
这里没有理由使用递归。
do...while循环就足够了,这意味着您不会用返回指针弄乱堆栈。我也不明白你为什么要区分一个空的FinishHoleActive和一个非空的。您两次都做同样的事情(除了日志消息)。