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;
}