你好,我目前正在统一制作一个 2D 自顶向下游戏,我想在整个地图上随机生成树木和岩石。两者都是可以与之交互的预制件。
这是我当前的代码。我在随机位置生成每个预制件,但需要检查它与我生成的最近的其他预制件的距离是否至少为 10(以便预制件均匀分布):
void SpawnNature()
{
for (int i = 0; i < 100; i++)
{
Pos = new Vector3(Random.Range(-70, 70), Random.Range(-70, 70), 0);
type = Random.Range(1, 3);
distance = 100;
GameObject nearestObject = null;
float shortestDistance = float.MaxValue;
foreach(GameObject Object in SpawnedObjects)
{
float dist = Vector2.Distance(Object.transform.position, Pos);
if (dist < shortestDistance)
{
shortestDistance = dist;
nearestObject = Object;
}
}
distance = Vector2.Distance(nearestObject.transform.position, Pos);
if (distance >= 10) {
if (type == 1) {
Instantiate(rock, Pos, Quaternion.identity);
}
if (type == 2) {
Instantiate(tree, Pos, Quaternion.identity);
}
}
}
}
问题是,我在第 19 行收到 NullReferenceException。我认为这是因为某些东西无法找到到最近预制件的距离。
我真的很感激任何帮助。我是一名新手程序员,真的只是想要一个解决方案。我知道这是糟糕且低效的代码,因此无论您是否可以修复此代码,或者采用完全不同的方法,我都会非常感谢您的意见!
非常感谢!
首先考虑
nearestObject
开头为 null
。
8: GameObject nearestObject = null;
如果您尝试访问其
.transform
,它将抛出错误。
8: GameObject nearestObject = null;
// ...
19: distance = Vector2.Distance(nearestObject.transform.position, Pos);
// ^ NullReferenceException
从那里你可以向后工作:
foreach
循环遍历所有SpawnedObjects
,所以如果没有,它就会抛出。dist
几乎总是低于shortestDistance
(float.MaxValue
),排除一些极不可能的情况。因此,基于此,如果您收到错误,
SpawnedObjects
必须为空,并且您没有输入foreach
。
如果它是您要生成的第一个对象,您可能不会有任何
SpawnedObjects
,因此您要么需要在循环之前生成一个,要么需要找到一种不同的方法来检查 nearestObject
是否为 null
在访问它之前。也不要忘记将新生成的对象添加到 SpawnedObjects
。
ps: 如果您正在学习编程,请尝试花时间通过调试器运行代码,逐步执行,以便您可以理解逻辑以及导致错误的原因。更好的方法是不使用
GameObject
或 Transform
,而是构建一个 Vector2
数组,然后当你完成后,循环遍历该数组实例化你的对象