
RoomTemplateSO와 RoomTemplateSO가 담고있어야할 정보를 관리할 클래스를 만들어보자. 대표적으로 RoomTemplateSO는 Doorway(입구)에 대한 정보를 담고 있어야 한다.
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
[CreateAssetMenu(fileName = "Room_", menuName = "Scriptable Objects/Dungeon/Room")]
public class RoomTemplateSO : ScriptableObject
{
    [HideInInspector] public string guid;
    #region Header Room PREFAB
    [Space(10)]
    [Header("ROOM PREFAB")]
    #endregion Header Room PREFAB
    #region Tooltip
    [Tooltip("The gameobejct prefab for the room (this will contain all the tilemaps for the room and environment game objects")]
    #endregion Tooltip
    public GameObject prefab;
    [HideInInspector] public GameObject previousPrefab; // this is used to regenrate the guid if the so is copied and the prefab is changed
    [Space(10)]
    #region Header ROOM CONFIGURATION
    [Space(10)]
    [Header("ROOM CONFIGURATION")]
    #endregion Header Room CONFIGURATION
    #region Tooltip
    [Tooltip("The room node type SO. The room node types correspond to the room nodes used in the room node graph. The exceptions being with corridors." +
        "In the room node graph there is just one corridor type 'Corridor'. For the room templates there are 2 corridor node types - Corridor NS and CorridorEW.")]
    #endregion Tooltip
    public RoomNodeTypeSO roomNodeType;
    #region Tooltip
    [Tooltip("If you imagine a rectangle around the room tilemap that just completely encloses it, the room lower bounds represent the bottom left corner of that rectangle." +
        "This should be determined from the tilemap for the room (using the coordinate brush pointer to get the tilemap grid position for that bottom left corner" +
        "(Note : this is the local tilemap position and NOT world position)")]
    #endregion Tooltip
    public Vector2Int lowerBounds;
    #region Tooltip
    [Tooltip("If you imagine a rectangle around the room tilemap that just completely encloses it, the room upper bounds represent the bottom right corner of that rectangle." +
        "This should be determined from the tilemap for the room (using the coordinate brush pointer to get the tilemap grid position for that top right corner" +
        "(Note : this is the local tilemap position and NOT world position)")]
    #endregion Tooltip
    public Vector2Int upperBounds;
    #region Tooltip
    [Tooltip("There should be a maximum of four doorways for a room - one for each compass direction. " +
        "These should have a consistent 3 tile opening size, with the middle tile position being the doorway coordinate 'position'")]
    #endregion Tooltip
    [SerializeField] public List<Doorway> doorwayList;
    #region Tooltip
    [Tooltip("Each possible spawn position (used for enemies and chests) for the room in tilemap coordinates should be added to this array")]
    #endregion Tooltip
    public Vector2Int[] spawnPositionArray;
    /// <summary>
    /// Returns the list of Entrances for the room template
    /// </summary>
   public List<Doorway> GetDoorwayList()
    {
        return doorwayList;
    }
    #region Validation
#if UNITY_EDITOR
    // Validate SO fields
    private void OnValidate()
    {
        // Set unique GUID if empty or the prefab changes
        if (guid == "" || previousPrefab != prefab)
        {
            guid = GUID.Generate().ToString();
            previousPrefab = prefab;
            EditorUtility.SetDirty(this);
        }
        HelperUtilities.ValidateCheckEnumerableValues(this, nameof(doorwayList), doorwayList);
        // Check spawn positions populated
        HelperUtilities.ValidateCheckEnumerableValues(this, nameof(spawnPositionArray), spawnPositionArray);
    }
#endif
    #endregion Validation
}
using UnityEngine;
[System.Serializable]
public class Doorway
{
    public Vector2Int position;
    public Orientation orientation;
    public GameObject doorPrefab;
    #region Header
    [Header("The Upper Left Position To Start Copying From")]
    #endregion
    public Vector2Int doorwayStartCopyPosition;
    #region Header
    [Header("The width of tiles in the doorway to copy over")]
    #endregion
    public int doorwayCopyTileWidth;
    #region Header
    [Header("The heigt of tiles in the doorway to copy over")]
    #endregion
    public int doorwayCopyTileHeight;
    [HideInInspector]
    public bool isConnected = false;
    [HideInInspector]
    public bool isUnavailable = false;
}