在程序生成中对齐生成点
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 点=] 的房间模板已正确对齐。
我创建了一些方框来重新创建 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 点=] 的房间模板已正确对齐。