From ac0e52e0df5857fc846810e4bfc5b6c613e9f4ed Mon Sep 17 00:00:00 2001 From: Felix Boucher Date: Mon, 22 May 2023 22:25:28 -0400 Subject: [PATCH] =?UTF-8?q?Maintenant,=20le=20level=20editor=20g=C3=A9n?= =?UTF-8?q?=C3=A8re=20les=20tilemaps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit le level editor se fiait à ce que le designer crée les tilemaps nécessaires avant de cliquer sur load maintenant le level editor génère les bons tilemaps avec leurs spécificités (layers sorting order, collider, visibilité etc) --- .../Editor/LevelEditorCustomInspector.cs | 18 ++++-- Assets/LevelEditor/Scripts/LevelEditor.cs | 2 +- .../Scripts/ScriptableObject/Level.cs | 17 +++++- Assets/LevelEditor/Scripts/TilemapData.cs | 58 +++++++++++++++++-- 4 files changed, 79 insertions(+), 16 deletions(-) diff --git a/Assets/LevelEditor/Scripts/Editor/LevelEditorCustomInspector.cs b/Assets/LevelEditor/Scripts/Editor/LevelEditorCustomInspector.cs index 25e2a70..17ccc9b 100644 --- a/Assets/LevelEditor/Scripts/Editor/LevelEditorCustomInspector.cs +++ b/Assets/LevelEditor/Scripts/Editor/LevelEditorCustomInspector.cs @@ -24,8 +24,7 @@ namespace GatherAndDefend.LevelEditor - Load button : iterates through all scene tilemaps and fills them according to what data can be found in the level file. Important considerations : -- the save and load buttons won't work if there is no Level assigned. -- the loading won't work if the scene tilemap names aren't the same as the tilemap data keys in the Level file", MessageType.None); +- the save and load buttons won't work if there is no Level assigned.", MessageType.None); DrawDefaultInspector(); if (GUILayout.Button(nameof(Create))) @@ -98,7 +97,7 @@ Important considerations : foreach (Tilemap tilemap in targ.GetComponentsInChildren()) { - map.Write(tilemap); + map.SaveFromTilemap(tilemap); } AssetDatabase.CreateAsset(map, path + "/" + name + extension); @@ -114,10 +113,17 @@ Important considerations : return; } - foreach (Tilemap tilemap in targ.GetComponentsInChildren()) + while (targ.transform.childCount > 0) { - tilemap.ClearAllTiles(); - targ.Level.Read(tilemap); + DestroyImmediate(targ.transform.GetChild(0).gameObject); + } + + foreach (TilemapData tilemapData in targ.Level) + { + var tilemap = new GameObject(tilemapData.Key).AddComponent(); + var rend = tilemap.gameObject.AddComponent(); + tilemapData.LoadToTilemap(tilemap); + tilemap.transform.SetParent(targ.transform); } _infoText = string.Empty; EditorSceneManager.MarkAllScenesDirty(); diff --git a/Assets/LevelEditor/Scripts/LevelEditor.cs b/Assets/LevelEditor/Scripts/LevelEditor.cs index 6b9c3b5..56eae91 100644 --- a/Assets/LevelEditor/Scripts/LevelEditor.cs +++ b/Assets/LevelEditor/Scripts/LevelEditor.cs @@ -1,9 +1,9 @@ using UnityEditor; using UnityEngine; -using UnityEngine.Tilemaps; namespace GatherAndDefend.LevelEditor { + [RequireComponent(typeof(Grid))] public class LevelEditor : MonoBehaviour { [SerializeField] diff --git a/Assets/LevelEditor/Scripts/ScriptableObject/Level.cs b/Assets/LevelEditor/Scripts/ScriptableObject/Level.cs index ee0b6e5..fcf1013 100644 --- a/Assets/LevelEditor/Scripts/ScriptableObject/Level.cs +++ b/Assets/LevelEditor/Scripts/ScriptableObject/Level.cs @@ -1,25 +1,36 @@ using System.Collections.Generic; using UnityEngine.Tilemaps; using UnityEngine; +using System.Collections; namespace GatherAndDefend.LevelEditor { - public class Level : ScriptableObject + public class Level : ScriptableObject, IEnumerable { [SerializeField] private List _data = new List(); - public void Write(Tilemap tilemap) + public void SaveFromTilemap(Tilemap tilemap) { var data = new TilemapData(); data.SaveFromTilemap(tilemap); _data.Add(data); } - public void Read(Tilemap tilemap) + public void LoadToTilemap(Tilemap tilemap) { var data = _data.Find(x => x.Key == tilemap.name); if (data == null) return; data.LoadToTilemap(tilemap); } + + public IEnumerator GetEnumerator() + { + return _data.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _data.GetEnumerator(); + } } } \ No newline at end of file diff --git a/Assets/LevelEditor/Scripts/TilemapData.cs b/Assets/LevelEditor/Scripts/TilemapData.cs index 05d4b94..d071495 100644 --- a/Assets/LevelEditor/Scripts/TilemapData.cs +++ b/Assets/LevelEditor/Scripts/TilemapData.cs @@ -2,22 +2,46 @@ using UnityEngine.Tilemaps; using UnityEngine; using System; +using System.Collections; namespace GatherAndDefend.LevelEditor { [Serializable] - public class TilemapData + public class TilemapData : IEnumerable { + public const int INVISIBLE_LAYER = 6; [SerializeField] private string _key; [SerializeField] - private List tiles; + private List _tiles; + [SerializeField] + private bool _isInvisible; + [SerializeField] + private bool _isCollidable; + [SerializeField] + private bool _isTrigger; + [SerializeField] + private int _renderOrder; + [SerializeField] + private string _renderLayer; + public string Key => _key; public void LoadToTilemap(Tilemap reference) { - foreach (TileData data in tiles) + var rend = reference.GetComponent(); + rend.sortingOrder = _renderOrder; + rend.sortingLayerName = _renderLayer; + if (_isInvisible) rend.gameObject.layer = INVISIBLE_LAYER; + if (_isCollidable) + { + var collision = rend.gameObject.AddComponent(); + collision.isTrigger = _isTrigger; + } + + + foreach (TileData data in _tiles) { reference.SetTile(data.Position, data.Tile); } @@ -25,7 +49,18 @@ namespace GatherAndDefend.LevelEditor public void SaveFromTilemap(Tilemap reference) { _key = reference.name; - tiles = new List(); + if (_isCollidable = reference.GetComponent()) + { + _isTrigger = reference.GetComponent().isTrigger; + } + + _isInvisible = reference.gameObject.layer == INVISIBLE_LAYER; + _renderLayer = reference.GetComponent().sortingLayerName; + _renderOrder = reference.GetComponent().sortingOrder; + + + _tiles = new List(); + BoundsInt bounds = reference.cellBounds; for (int i = bounds.xMin; i <= bounds.xMax; i++) { @@ -35,13 +70,24 @@ namespace GatherAndDefend.LevelEditor TileBase tile = reference.GetTile(position); if (!tile) continue; var tileData = new TileData(position, tile); - tiles.Add(tileData); + _tiles.Add(tileData); } } } + + public IEnumerator GetEnumerator() + { + return _tiles.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _tiles.GetEnumerator(); + } + public TilemapData() { - tiles = new List(); + _tiles = new List(); } } } \ No newline at end of file