diff --git a/Assets/Escape Room Engine/Engine/Scripts/Dimensions.cs b/Assets/Escape Room Engine/Engine/Scripts/Dimensions.cs new file mode 100644 index 0000000..b44c518 --- /dev/null +++ b/Assets/Escape Room Engine/Engine/Scripts/Dimensions.cs @@ -0,0 +1,20 @@ +namespace Escape_Room_Engine.Engine.Scripts +{ + public readonly struct Dimensions + { + internal Dimensions(float width, float length, float x, float y) + { + Width = width; + Length = length; + X = x; + Y = y; + } + + public float Width { get; } + public float Length { get; } + public float X { get; } + public float Y { get; } + + public override string ToString() => $"({Width}, {Length}) at ({X}, {Y})"; + } +} \ No newline at end of file diff --git a/Assets/Escape Room Engine/Engine/Scripts/SpaceSize.cs.meta b/Assets/Escape Room Engine/Engine/Scripts/Dimensions.cs.meta similarity index 100% rename from Assets/Escape Room Engine/Engine/Scripts/SpaceSize.cs.meta rename to Assets/Escape Room Engine/Engine/Scripts/Dimensions.cs.meta diff --git a/Assets/Escape Room Engine/Engine/Scripts/Editor/EngineEditor.cs b/Assets/Escape Room Engine/Engine/Scripts/Editor/EngineEditor.cs index 1f89c17..12d4160 100644 --- a/Assets/Escape Room Engine/Engine/Scripts/Editor/EngineEditor.cs +++ b/Assets/Escape Room Engine/Engine/Scripts/Editor/EngineEditor.cs @@ -29,7 +29,6 @@ namespace Escape_Room_Engine.Engine.Scripts.Editor { if (EditorApplication.isPlaying) { - Debug.Log("Generating new room..."); Engine.DefaultEngine.DisposeOldestRoom(); Engine.DefaultEngine.GenerateRoom(); UpdateUI(); diff --git a/Assets/Escape Room Engine/Engine/Scripts/Engine.cs b/Assets/Escape Room Engine/Engine/Scripts/Engine.cs index 1b09b8d..89f0886 100644 --- a/Assets/Escape Room Engine/Engine/Scripts/Engine.cs +++ b/Assets/Escape Room Engine/Engine/Scripts/Engine.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -using System.Linq; using UnityEngine; +using Random = UnityEngine.Random; namespace Escape_Room_Engine.Engine.Scripts { @@ -10,9 +10,21 @@ namespace Escape_Room_Engine.Engine.Scripts public Material roomMaterial; + [Tooltip("The minimum size that should be allowed for rooms.")] + public Vector2Int minRoomSize; + [Tooltip("The size of the physical play space available to the engine.")] public Vector2Int playSpace; + public int NumberOfRooms => _rooms.Count; - private List _rooms = new(1); + private readonly List _rooms = new(1); + private GameObject _playSpaceOrigin; + + private void Start() + { + _playSpaceOrigin = new GameObject("Play Space Origin"); + _playSpaceOrigin.transform.SetParent(transform); + _playSpaceOrigin.transform.localPosition = new Vector3(-playSpace.x / 2f, 0, -playSpace.y / 2f); + } public void GenerateRoom() { @@ -23,17 +35,25 @@ namespace Escape_Room_Engine.Engine.Scripts _rooms.Add(room); GenerateSpace(room, entrance); // TODO: rooms with more than one space - room.InstantiateRoom(transform, (_rooms.Count - 1).ToString()); + room.InstantiateRoom(_playSpaceOrigin.transform, (_rooms.Count - 1).ToString()); } - void GenerateSpace(Room room, Passage from) + private void GenerateSpace(Room room, Passage from) { var exit = new Passage(); - var size = new SpaceSize(Random.Range(2, 6), Random.Range(2, 6)); // TODO: no hardcoded space size - var space = new Space(size, from, exit); + var space = new Space(GenerateSpaceDimensions(), from, exit); room.AddSpace(space, exit); } + private Dimensions GenerateSpaceDimensions() + { + var xMin = Random.Range(0, playSpace.x - minRoomSize.x + 1); + var xMax = Random.Range(xMin + minRoomSize.x, playSpace.x + 1); + var yMin = Random.Range(0, playSpace.y - minRoomSize.y + 1); + var yMax = Random.Range(yMin + minRoomSize.y, playSpace.y + 1); + return new Dimensions(xMax - xMin, yMax - yMin, xMin, yMin); + } + /// /// Dispose of the oldest room to save resources. /// diff --git a/Assets/Escape Room Engine/Engine/Scripts/Room.cs b/Assets/Escape Room Engine/Engine/Scripts/Room.cs index 503cf69..60c4c25 100644 --- a/Assets/Escape Room Engine/Engine/Scripts/Room.cs +++ b/Assets/Escape Room Engine/Engine/Scripts/Room.cs @@ -24,7 +24,7 @@ namespace Escape_Room_Engine.Engine.Scripts internal void InstantiateRoom(Transform parent, string name) { _roomObject = new GameObject($"Room {name}"); - _roomObject.transform.SetParent(parent); + _roomObject.transform.SetParent(parent, false); for (var i = 0; i < _spaces.Count; i++) { diff --git a/Assets/Escape Room Engine/Engine/Scripts/Space.cs b/Assets/Escape Room Engine/Engine/Scripts/Space.cs index f61b7b4..c6c685c 100644 --- a/Assets/Escape Room Engine/Engine/Scripts/Space.cs +++ b/Assets/Escape Room Engine/Engine/Scripts/Space.cs @@ -8,13 +8,13 @@ namespace Escape_Room_Engine.Engine.Scripts // public DoorModule Entrance => (DoorModule)_modules.Find(module => module.IsType((ModuleType)DoorType.Entrance)); // public DoorModule Exit => (DoorModule)_modules.Find(module => module.IsType((ModuleType)DoorType.Exit)); - private readonly SpaceSize _size; + private readonly Dimensions _dimensions; private GameObject _spaceObject; private List _modules = new(2); - internal Space(SpaceSize size, Passage entrance, Passage exit) + internal Space(Dimensions dimensions, Passage entrance, Passage exit) { - _size = size; + _dimensions = dimensions; // connect the space to its passages entrance.ConnectTo(new DoorModule(DoorType.Entrance)); @@ -30,27 +30,27 @@ namespace Escape_Room_Engine.Engine.Scripts internal void InstantiateSpace(Transform parent, string name) { - _spaceObject = new GameObject($"Space {name}"); - _spaceObject.transform.SetParent(parent); - - var meshFilter = _spaceObject.AddComponent(); + _spaceObject = new GameObject($"Space {name}", typeof(MeshFilter), typeof(MeshRenderer)); + _spaceObject.transform.SetParent(parent, false); + _spaceObject.transform.localPosition = new Vector3(_dimensions.X, 0, _dimensions.Y); + + var meshFilter = _spaceObject.GetComponent(); meshFilter.mesh = GenerateMesh(); - var meshRenderer = _spaceObject.AddComponent(); + var meshRenderer = _spaceObject.GetComponent(); meshRenderer.material = Engine.DefaultEngine.roomMaterial; } - internal Mesh GenerateMesh() + private Mesh GenerateMesh() { var mesh = new Mesh(); - float halfWidth = _size.Width / 2f, halfHeight = _size.Height / 2f; mesh.vertices = new[] { - new Vector3(-halfWidth, 0, -halfHeight), - new Vector3(halfWidth, 0, -halfHeight), - new Vector3(-halfWidth, 0, halfHeight), - new Vector3(halfWidth, 0, halfHeight) + new Vector3(0, 0, 0), + new Vector3(_dimensions.Width, 0, 0), + new Vector3(0, 0, _dimensions.Length), + new Vector3(_dimensions.Width, 0, _dimensions.Length) }; mesh.triangles = new[] diff --git a/Assets/Escape Room Engine/Engine/Scripts/SpaceSize.cs b/Assets/Escape Room Engine/Engine/Scripts/SpaceSize.cs deleted file mode 100644 index c30ee9d..0000000 --- a/Assets/Escape Room Engine/Engine/Scripts/SpaceSize.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace Escape_Room_Engine.Engine.Scripts -{ - public readonly struct SpaceSize - { - internal SpaceSize(int width, int height) - { - Width = width; - Height = height; - } - - // TODO: intersections and unions of rectangles - - public int Width { get; } - public int Height { get; } - - public override string ToString() => $"({Width}, {Height})"; - } -} \ No newline at end of file diff --git a/Assets/Scenes/TestScene.unity b/Assets/Scenes/TestScene.unity index 146f62b..b7c2d5e 100644 --- a/Assets/Scenes/TestScene.unity +++ b/Assets/Scenes/TestScene.unity @@ -1232,6 +1232,8 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: roomMaterial: {fileID: 2100000, guid: 39e2ed014eda5d6408c16fbf0fa80781, type: 2} + minRoomSize: {x: 3, y: 3} + playSpace: {x: 4, y: 6} --- !u!4 &1568048335 Transform: m_ObjectHideFlags: 0