在程序生成中对齐生成点

Align Spawnpoints in Procedural generation

我创建了一些方框来重新创建 2D 关卡,其中地牢是在程序生成中创建的。尽管当我 运行 我的脚本创建了正确的关卡时,但它没有将生成点彼此对齐。

这会导致无限制的关卡生成(因为重生点不接触),但它也确保角色无法从一种方式转到另一种方式。我已经确保每个级别都是 10 x 10 并且重生点距离房间中间 10 像素。我想确保出生点之间发生碰撞,但不幸的是,情况并非如此。

我创建了多个房间,每个房间都有自己的出口(出生点),具体取决于出生点的位置,它可以连接到另一个具有相同出生点的房间(左侧出口的房间由至少有一个正确出口的房间)。

我把所有这些都放在一个 int 中,声明可用房间的数量。

Roomspawner 代码


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RoomSpawner : MonoBehaviour
{
    public int openingDirection;
    // 1 --> need bottom door
    // 2 --> need top door
    // 3 --> need left door
    // 4 --> need right door

    private RoomTemplates templates;
    private int rand;
    private bool spawned = false;

    void Start(){
      templates = GameObject.FindGameObjectWithTag("Rooms").GetComponent<RoomTemplates>();
      Invoke("Spawn", 0.5f);
    }

    void Spawn(){
      if(spawned == false){
        if(openingDirection == 1){
            // Need to spawn a room with a BOTTOM door.
            rand = Random.Range(0, templates.bottomRooms.Length);
            Instantiate(templates.bottomRooms[rand], transform.position, templates.bottomRooms[rand].transform.rotation);
          } else if(openingDirection == 2){
            // Need to spawn a room with a TOP door.
            rand = Random.Range(0, templates.topRooms.Length);
            Instantiate(templates.topRooms[rand], transform.position, templates.topRooms[rand].transform.rotation);
          } else if(openingDirection == 3){
            // Need to spawn a room with a LEFT door.
            rand = Random.Range(0, templates.leftRooms.Length);
            Instantiate(templates.leftRooms[rand], transform.position, templates.leftRooms[rand].transform.rotation);
          } else if(openingDirection == 4){
            // Need to spawn a room with a RIGHT door.
            rand = Random.Range(0, templates.rightRooms.Length);
            Instantiate(templates.rightRooms[rand], transform.position, templates.rightRooms[rand].transform.rotation);
          }
          spawned = true;
      }

      void OnTriggerEnter2D(Collider2D other){
        if(other.CompareTag("SpawnPoint")){
          if(other.GetComponent<RoomSpawner>().spawned == false && spawned == false){
            // spawns walls blocking off any opening !
            Instantiate(templates.closedRoom, transform.position, Quaternion.identity);
            Destroy(gameObject);
          }
          spawned = true;
        }
    }
  }
}

房间模板


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RoomTemplates : MonoBehaviour
{
    public GameObject[] bottomRooms;
    public GameObject[] topRooms;
    public GameObject[] leftRooms;
    public GameObject[] rightRooms;

    public GameObject closedRoom;
}

我对一个只有 1 个重生点的房间进行了新测试。我在创建第二个重生点时暂停了游戏,因此您可以看到创建的第二个关卡的高度与起始关卡的高度不同。

在下方您可以看到连接房间在起始房间上方生成。这样做会把所有其他房间都弄乱。

相反,我希望它像这样

在我看来,问题的出现是由于您实例化房间副本的方式。

它们都在 transform.position 实例化,但考虑到它们似乎在各种地方生成,我建议您确保 [=16] 的枢轴 point/center 点=] 的房间模板已正确对齐。