Issue with separating a room for generating content in Unity

34 views Asked by At

I am creating a top down game where the level is generated procedurally and one of the functions is generating objects (player, opponents, etc.). At this moment, one room with the player is generated and the rest are rooms with opponents. I want to add an endroom (you can choose between a boss or a portal to the next level). For this purpose, I added bossRoom and the SelectBossSpawnPoints method to the public class RoomContentGenerator script, but it does not work as it should. For this he also uses Dijkstra's algorithm

Edit: after entering this method and the boss/portal script, items are generated only from the player room, and they are also generated under the wrong object (they should be under RoomContent). Once, a Boss object was generated in the middle of a room with enemies, but I was unable to reproduce the error.

What I expect is a separate room with only a portal to the next level or only a boss.

using Cinemachine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Events;

public class RoomContentGenerator : MonoBehaviour
{
    [SerializeField]
    private RoomGenerator playerRoom, defaultRoom, bossRoom;

    List<GameObject> spawnedObjects = new List<GameObject>();

    [SerializeField]
    private GraphTest graphTest;


    public Transform itemParent;

    [SerializeField]
    private CinemachineVirtualCamera cinemachineCamera;

    public UnityEvent RegenerateDungeon;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            foreach (var item in spawnedObjects)
            {
                Destroy(item);
            }
            RegenerateDungeon?.Invoke();
        }
    }
    public void GenerateRoomContent(DungeonData dungeonData)
    {
        foreach (GameObject item in spawnedObjects)
        {
            DestroyImmediate(item);
        }
        spawnedObjects.Clear();

        SelectPlayerSpawnPoint(dungeonData);
        SelectBossSpawnPoints(dungeonData);
        SelectEnemySpawnPoints(dungeonData);

        foreach (GameObject item in spawnedObjects)
        {
            if(item != null)
                item.transform.SetParent(itemParent, false);
        }
    }

    private void SelectPlayerSpawnPoint(DungeonData dungeonData)
    {
        int randomRoomIndex = UnityEngine.Random.Range(0, dungeonData.roomsDictionary.Count);
        Vector2Int playerSpawnPoint = dungeonData.roomsDictionary.Keys.ElementAt(randomRoomIndex);

        graphTest.RunDijkstraAlgorithm(playerSpawnPoint, dungeonData.floorPositions);

        Vector2Int roomIndex = dungeonData.roomsDictionary.Keys.ElementAt(randomRoomIndex);

        List<GameObject> placedPrefabs = playerRoom.ProcessRoom(
            playerSpawnPoint,
            dungeonData.roomsDictionary.Values.ElementAt(randomRoomIndex),
            dungeonData.GetRoomFloorWithoutCorridors(roomIndex)
            );

        FocusCameraOnThePlayer(placedPrefabs[placedPrefabs.Count - 1].transform);

        spawnedObjects.AddRange(placedPrefabs);

        dungeonData.roomsDictionary.Remove(playerSpawnPoint);
    }

    private void FocusCameraOnThePlayer(Transform playerTransform)
    {
        cinemachineCamera.LookAt = playerTransform;
        cinemachineCamera.Follow = playerTransform;
    }
    private void SelectBossSpawnPoints(DungeonData dungeonData)
    {
        Vector2Int playerSpawnPoint = dungeonData.roomsDictionary.Keys.First();

        Vector2Int farthestRoom = Vector2Int.zero;
        float maxDistance = 0f;

        foreach (KeyValuePair<Vector2Int, HashSet<Vector2Int>> roomData in dungeonData.roomsDictionary)
        {
            float distance = Vector2Int.Distance(playerSpawnPoint, roomData.Key);

            if (distance > maxDistance)
            {
                maxDistance = distance;
                farthestRoom = roomData.Key;
            }
        }


        List<GameObject> bossRoomObjects = bossRoom.ProcessRoom(
            farthestRoom,
            dungeonData.roomsDictionary[farthestRoom],
            dungeonData.GetRoomFloorWithoutCorridors(farthestRoom)
        );

        spawnedObjects.AddRange(bossRoomObjects);
    }

    private void SelectEnemySpawnPoints(DungeonData dungeonData)
    {
        foreach (KeyValuePair<Vector2Int,HashSet<Vector2Int>> roomData in dungeonData.roomsDictionary)
        { 
            spawnedObjects.AddRange(
                defaultRoom.ProcessRoom(
                    roomData.Key,
                    roomData.Value, 
                    dungeonData.GetRoomFloorWithoutCorridors(roomData.Key)
                    )
            );

        }
    }

}

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

public class BossRoom : RoomGenerator
{
    public enum RoomType
    {
        Boss,
        Portal
    }

    [SerializeField]
    private PrefabPlacer prefabPlacer;

    public List<EnemyPlacementData> enemyPlacementData;
    public List<ItemPlacementData> itemData;

    public GameObject bossObjectPrefab;
    public GameObject portalObjectPrefab;

    public RoomType roomType;

    public override List<GameObject> ProcessRoom(Vector2Int roomCenter, HashSet<Vector2Int> roomFloor, HashSet<Vector2Int> roomFloorNoCorridors)
    {
        ItemPlacementHelper itemPlacementHelper =
            new ItemPlacementHelper(roomFloor, roomFloorNoCorridors);

        List<GameObject> placedObjects =
            prefabPlacer.PlaceAllItems(itemData, itemPlacementHelper);

        placedObjects.AddRange(prefabPlacer.PlaceEnemies(enemyPlacementData, itemPlacementHelper));

        GameObject selectedObjectPrefab = GetSelectedObjectPrefab();

        GameObject selectedObject = prefabPlacer.CreateObject(selectedObjectPrefab, roomCenter + new Vector2(0.5f, 0.5f));
        placedObjects.Add(selectedObject);

        return placedObjects;
    }

    private GameObject GetSelectedObjectPrefab()
    {
        return roomType == RoomType.Boss ? bossObjectPrefab : portalObjectPrefab;
    }
}

enter image description here

0

There are 0 answers