Unity地牢世代

Unity Dungeon Generation

我正在尝试使用预制件生成随机地牢。

我让它从门口列表中随机选择一个门口并生成一个新房间。然后,我在边界框上有一个脚本,用于在它与另一个房间相交时更新房间脚本。

我目前遇到的问题是,我不完全确定如何等待或延迟检查 onTriggerEvent 是否已被调用。

我目前正在检查是否发生了碰撞,并在发生碰撞时将 boolean 变量设置为 true,否则为 false。即使发生碰撞,这也总是导致变量为假。

编辑:
这是目前我检查房间是否有效的方式:

DungeonGenerator.cs:

// This is being ran in a for loop.
if (currentRoom.isValid())
{
   // Removed for clarity. This essentially just places a room.
}

RoomValidation.cs:

private void OnTriggerEnter(Collider other)
{
    // This is the variable i was talking about.
    // Currently it seems like this is always false when i check.
    // If it's false then it fails validation.
    if (other.tag.equals("Room"))
          room.validated.Invoke(false);
}

isValid() 函数只是 returns 一个经过验证的布尔变量。这似乎更新得不够快,无法更新碰撞。我研究了 Coroutine 的,这似乎不可行。这不会只是 运行 在循环之外并导致同样的问题吗?

如果我理解正确,你可以使用 OnTriggerStay(),因为它 returns 如果触发器中有东西则为真,否则为假。如果您使用 2d,请使用 OnTriggerStay2D()。要使用它,只需像通常那样将它定义为一个函数,参数为 Collider other,Collider 是类型,other 是另一个碰撞器。然后,您可以查看碰撞器的详细信息(对于例如,您可以检查它是否是播放器),然后对另一个碰撞器(以及扩展到整个对象)和脚本所附加的对象执行操作。这是一个示例,但可能需要进行调整才能完全适合您想要执行的操作。

public class YourClass
{
    void OnTriggerStay(other) //OnTriggerStay2D if it's 2D
    {
        if (other.tag == "player") //Checks by tag, only works if the player has a
        //player tag, and if it doesn't... well, it probably should.
        {
            UpdateRoom(); //Update room, idk how you would do it but replace this when you do it
        }
    }
}

如果有任何遗漏,请回复,我会尽力提供帮助。

所以,我终于让它工作了。我改变了地方房间功能的运作方式。而不是检查房间是否在功能中有效,我现在在它之外进行。我放置了房间,然后等待 运行 的固定更新,然后检查它是否有效。不知道为什么这在以前不起作用。我现在可以毫无问题地生成地下城了。