Я создал несколько ящиков, чтобы воссоздать 2D-уровень, где подземелье создается в процедурной генерации. Хотя, когда я запускаю свой скрипт, он создает правильные уровни, но не выравнивает точки появления друг с другом.

Это вызывает неограниченную генерацию уровней (поскольку точки возрождения не соприкасаются), но также гарантирует, что персонаж не сможет перейти с одного пути на другой. Я убедился, что каждый уровень имеет размер 10 x 10, а точки возрождения находятся на расстоянии 10 пикселей от середины комнат. Я хотел обеспечить столкновение между точками возрождения, но, к сожалению, это не так.

Я создал несколько комнат, каждая из которых имеет свой собственный выход (точка возрождения), в зависимости от того, где находится точка возрождения, она может соединяться с другой комнатой с такой же точкой возрождения (комната с левым выходом соединена комнатой с как минимум правый выход).
Я помещаю все это в int, объявляя количество доступных комнат.
Код спавнера комнат
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 точка возрождения. Я приостановил игру, когда была создана вторая точка возрождения, поэтому вы можете видеть, что 2-й уровень создан с другой высотой, чем начальная.

Внизу вы можете увидеть соединительную комнату, появляющуюся чуть выше начальной. Делая это, он портит все остальные комнаты.

Вместо этого я хочу, чтобы это было так






Мне кажется, что проблема возникает из-за того, как вы создаете копии комнат.
Все они создаются в transform.position, но, учитывая, что они появляются в самых разных местах, я бы посоветовал вам убедиться, что точка поворота/центральная точка префабов/сеток ваших шаблонов комнат выровнена правильно.
Я понимаю, что ты имеешь в виду! Видимо по какой-то причине я должен ставить точки спавна ниже середины? Таким образом, он становится немного ближе, не уверен, почему я должен так работать, хотя
Не могли бы вы опубликовать свойства инспектора для префабов комнаты?
Привет! Я заставил это работать с тем, что вы сказали. Комнаты, наконец, появляются в непосредственной близости друг от друга. Проблема, с которой я столкнулся сейчас, заключается в том, что через некоторое время комнаты начинают расти друг над другом. Чего не должно быть? Я постараюсь сделать новый пост об этом, так как этот вопрос решен. Еще раз спасибо за ваш ответ!
Привет! Я поставил Y и X всех префабов на 0, чтобы посмотреть, все ли выровняется. Я изменил микроскопические различия пикселей. Теперь каждый квадрат точно такой же, с теми же различиями в пикселях. Но даже после всех этих изменений, к сожалению, я продолжаю получать те же результаты.