Выравнивание точек возрождения в процедурной генерации

Я создал несколько ящиков, чтобы воссоздать 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-й уровень создан с другой высотой, чем начальная.

Выравнивание точек возрождения в процедурной генерации

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

Выравнивание точек возрождения в процедурной генерации

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

Выравнивание точек возрождения в процедурной генерации

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
128
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне кажется, что проблема возникает из-за того, как вы создаете копии комнат.

Все они создаются в transform.position, но, учитывая, что они появляются в самых разных местах, я бы посоветовал вам убедиться, что точка поворота/центральная точка префабов/сеток ваших шаблонов комнат выровнена правильно.

Привет! Я поставил Y и X всех префабов на 0, чтобы посмотреть, все ли выровняется. Я изменил микроскопические различия пикселей. Теперь каждый квадрат точно такой же, с теми же различиями в пикселях. Но даже после всех этих изменений, к сожалению, я продолжаю получать те же результаты.

mafiaf 30.07.2019 16:46

Я понимаю, что ты имеешь в виду! Видимо по какой-то причине я должен ставить точки спавна ниже середины? Таким образом, он становится немного ближе, не уверен, почему я должен так работать, хотя

mafiaf 30.07.2019 16:56

Не могли бы вы опубликовать свойства инспектора для префабов комнаты?

Chae Ho Shin 30.07.2019 17:01

Привет! Я заставил это работать с тем, что вы сказали. Комнаты, наконец, появляются в непосредственной близости друг от друга. Проблема, с которой я столкнулся сейчас, заключается в том, что через некоторое время комнаты начинают расти друг над другом. Чего не должно быть? Я постараюсь сделать новый пост об этом, так как этот вопрос решен. Еще раз спасибо за ваш ответ!

mafiaf 30.07.2019 17:36

Другие вопросы по теме