如何在Unity2D中将预制件均匀分布在空间周围?

问题描述 投票:0回答:1

你好,我目前正在统一制作一个 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。我认为这是因为某些东西无法找到到最近预制件的距离。

我真的很感激任何帮助。我是一名新手程序员,真的只是想要一个解决方案。我知道这是糟糕且低效的代码,因此无论您是否可以修复此代码,或者采用完全不同的方法,我都会非常感谢您的意见!

非常感谢!

c# unity-game-engine 2d spawning
1个回答
0
投票

首先考虑

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
数组,然后当你完成后,循环遍历该数组实例化你的对象

© www.soinside.com 2019 - 2024. All rights reserved.