Skip to content

Commit 9773cdc

Browse files
committed
Merge branch 'pr/67'
2 parents 3002788 + cee7833 commit 9773cdc

17 files changed

+223
-15
lines changed

Assets/LDtkUnity/Editor/Builders/LDtkBuilderEntity.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public LDtkBuilderEntity(LDtkProjectImporter project, Level level, LDtkComponent
2424

2525
public LDtkComponentEntity[] BuildEntityLayerInstances()
2626
{
27-
SortingOrder.Next();
27+
SortingOrder.Next(Layer.Identifier);
2828

2929
LDtkFieldParser.CacheRecentBuilder(this);
3030

Assets/LDtkUnity/Editor/Builders/LDtkBuilderIntGridValue.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public LDtkBuilderIntGridValue(LDtkProjectImporter importer, Level level, LDtkCo
1717
public void BuildIntGridValues()
1818
{
1919
RoundTilemapPos();
20-
SortingOrder.Next();
20+
SortingOrder.Next(Layer.Identifier);
2121

2222
LayerDefinition layerDef = Layer.Definition;
2323
IntGridValueDefinition[] intGridValueDefs = layerDef.IntGridValues;

Assets/LDtkUnity/Editor/Builders/LDtkBuilderLevel.cs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using UnityEngine;
1+
using System.Collections.Generic;
2+
using UnityEngine;
23

34
namespace LDtkUnity.Editor
45
{
@@ -102,8 +103,8 @@ private void BuildLevelProcess()
102103
AddIidComponent();
103104
LDtkProfiler.EndSample();
104105

105-
LDtkProfiler.BeginSample("new LDtkSortingOrder");
106-
_sortingOrder = new LDtkSortingOrder();
106+
LDtkProfiler.BeginSample("LDtkSortingOrder");
107+
CreateSortingOrder();
107108
LDtkProfiler.EndSample();
108109

109110
LDtkProfiler.BeginSample("BuildLayerInstances");
@@ -131,6 +132,24 @@ private void BuildLevelProcess()
131132
LDtkProfiler.EndSample();
132133
}
133134

135+
private void CreateSortingOrder()
136+
{
137+
var orders = _project.LayerCustomSortingOrders;
138+
139+
if (!_project.UseLayerCustomSortingOrders || orders.IsNullOrEmpty())
140+
{
141+
_sortingOrder = new LDtkSortingOrder();
142+
return;
143+
}
144+
145+
var sortingOrders = new Dictionary<string, int>(orders.Length);
146+
foreach (LDtkLayerCustomSortingOrder order in orders)
147+
{
148+
sortingOrders.Add(order._ldtkLayerName, order._ldtkLayerOrder);
149+
}
150+
_sortingOrder = new LDtkSortingOrder(sortingOrders);
151+
}
152+
134153
private void BuildFields()
135154
{
136155
bool addedFields = TryAddFields();

Assets/LDtkUnity/Editor/Builders/LDtkBuilderTileset.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public LDtkBuilderTileset(LDtkProjectImporter project, Level level, LDtkComponen
2121

2222
private void ConstructNewTilemap()
2323
{
24-
SortingOrder.Next();
24+
SortingOrder.Next(Layer.Identifier);
2525

2626
string tilemapName = Layer.IsTilesLayer ? "Tiles" : "AutoLayer";
2727

Assets/LDtkUnity/Editor/Builders/LDtkSortingOrder.cs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,41 @@
1-
namespace LDtkUnity.Editor
1+
using System.Collections.Generic;
2+
3+
namespace LDtkUnity.Editor
24
{
5+
/// <summary>
6+
/// Increments for each occurrence of a tilemap or entity when building layers to ensure everything is layered correctly.
7+
/// This can be overridden to jump to custom-set sorting order numbers if needed.
8+
/// </summary>
39
internal sealed class LDtkSortingOrder
410
{
511
public int SortingOrderValue { get; private set; } = 0;
12+
private readonly Dictionary<string, int> _layerNameOverrides;
13+
private readonly HashSet<string> _layerNameOccurrences;
14+
15+
public LDtkSortingOrder(Dictionary<string, int> layerNameOverrides = null)
16+
{
17+
_layerNameOverrides = layerNameOverrides;
618

7-
public void Next()
19+
if (layerNameOverrides != null)
20+
{
21+
_layerNameOccurrences = new HashSet<string>(layerNameOverrides.Count);
22+
}
23+
}
24+
25+
public void Next(string layerIdentifier = null)
826
{
27+
//note: this supports repeated layer occurrences, even if that never happens.
28+
29+
//Jump to the custom order if we get the first occurrence of a layer
30+
if (layerIdentifier != null && _layerNameOccurrences != null && _layerNameOccurrences.Add(layerIdentifier))
31+
{
32+
if (_layerNameOverrides != null && _layerNameOverrides.TryGetValue(layerIdentifier, out int order))
33+
{
34+
SortingOrderValue = order;
35+
return;
36+
}
37+
}
38+
939
SortingOrderValue--;
1040
}
1141
}

Assets/LDtkUnity/Editor/CustomEditor/Importer/LDtkProjectImporterEditor.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ internal sealed class LDtkProjectImporterEditor : LDtkImporterEditor
1717
private LDtkSectionIntGrids _sectionIntGrids;
1818
private LDtkSectionEntities _sectionEntities;
1919
private LDtkSectionEnums _sectionEnums;
20+
private LDtkSectionLayerCustomSortingOrder _sectionCustomSortingOrder;
2021
private bool _shouldApply = true;
2122

2223

@@ -41,13 +42,15 @@ public override void OnEnable()
4142
_sectionIntGrids = new LDtkSectionIntGrids(this, serializedObject);
4243
_sectionEntities = new LDtkSectionEntities(this, serializedObject);
4344
_sectionEnums = new LDtkSectionEnums(this, serializedObject);
45+
_sectionCustomSortingOrder = new LDtkSectionLayerCustomSortingOrder(this, serializedObject);
4446

4547
_sectionDrawers = new[]
4648
{
4749
(ILDtkSectionDrawer)_sectionMain,
4850
_sectionIntGrids,
4951
_sectionEntities,
5052
_sectionEnums,
53+
_sectionCustomSortingOrder,
5154
SectionDependencies
5255
};
5356

@@ -175,6 +178,10 @@ private void ShowGUI()
175178
_sectionEnums.Draw(defs.Enums);
176179
LDtkProfiler.EndSample();
177180

181+
LDtkProfiler.BeginSample("CustomSortingOrderSection");
182+
_sectionCustomSortingOrder.Draw(defs.Layers);
183+
LDtkProfiler.EndSample();
184+
178185
LDtkProfiler.BeginSample("DependenciesSection");
179186
SectionDependencies.Draw();
180187
LDtkProfiler.EndSample();

Assets/LDtkUnity/Editor/CustomEditor/SectionDrawers/LDtkSectionDataDrawer.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,9 @@ private void AddMissingData(string[] newAssetKeys)
157157
SerializedProperty[] elements = ArrayProp.GetArrayElements();
158158
string[] elementKeys = elements.Select(GetKeyForElement).ToArray();
159159

160-
foreach (string newAssetKey in newAssetKeys)
160+
for (var i = 0; i < newAssetKeys.Length; i++)
161161
{
162+
string newAssetKey = newAssetKeys[i];
162163
if (elementKeys.Contains(newAssetKey))
163164
{
164165
//we previously already have it, don't add one
@@ -173,12 +174,17 @@ private void AddMissingData(string[] newAssetKeys)
173174
insertedKeyProp.stringValue = newAssetKey;
174175

175176
SerializedProperty insertedValueProp = GetValuePropForElement(insertedProp);
176-
insertedValueProp.objectReferenceValue = null;
177+
SetDefaultElementValue(insertedValueProp, i);
177178

178179
//Debug.Log($"Inserted new asset at {0} for key {newAssetKey}");
179180
}
180181
}
181-
182+
183+
protected virtual void SetDefaultElementValue(SerializedProperty insertedValueProp, int i)
184+
{
185+
insertedValueProp.objectReferenceValue = null;
186+
}
187+
182188
private void BubbleSortArray(string[] assetKeys)
183189
{
184190
if (ArrayProp.arraySize != assetKeys.Length)
@@ -251,11 +257,11 @@ private SerializedProperty GetKeyPropForArray(int arrayIndex)
251257
SerializedProperty element = ArrayProp.GetArrayElementAtIndex(arrayIndex);
252258
return GetKeyPropForElement(element);
253259
}
254-
private SerializedProperty GetKeyPropForElement(SerializedProperty element)
260+
protected virtual SerializedProperty GetKeyPropForElement(SerializedProperty element)
255261
{
256262
return element.FindPropertyRelative(LDtkAsset<Object>.PROPERTY_KEY);
257263
}
258-
private SerializedProperty GetValuePropForElement(SerializedProperty element)
264+
protected virtual SerializedProperty GetValuePropForElement(SerializedProperty element)
259265
{
260266
return element.FindPropertyRelative(LDtkAsset<Object>.PROPERTY_ASSET);
261267
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
using System.Collections.Generic;
2+
using UnityEditor;
3+
using UnityEngine;
4+
5+
namespace LDtkUnity.Editor
6+
{
7+
internal sealed class LDtkSectionLayerCustomSortingOrder : LDtkSectionDataDrawer<LayerDefinition>
8+
{
9+
private SerializedProperty _useProp;
10+
private static GUIContent _usePropLabel = new GUIContent("Use Custom Sorting Orders");
11+
12+
protected override string PropertyName => LDtkProjectImporter.LAYER_SORTING_ORDERS;
13+
protected override string GuiText => "Custom Sorting Orders";
14+
15+
protected override string GuiTooltip =>
16+
"Normally in the import process, the sorting order is decremented for all occurrences of LDtk layers, starting from 0.\n" +
17+
"However, this option can be toggled on to customize sorting orders for specific layers.";
18+
19+
protected override Texture GuiImage => LDtkIconUtility.LoadLayerIcon();
20+
protected override string ReferenceLink => LDtkHelpURL.SECTION_CUSTOM_SORTING_ORDER;
21+
22+
public LDtkSectionLayerCustomSortingOrder(LDtkImporterEditor editor, SerializedObject serializedObject) : base(editor, serializedObject)
23+
{
24+
}
25+
26+
public override void Init()
27+
{
28+
base.Init();
29+
_useProp = SerializedObject.FindProperty(LDtkProjectImporter.USE_LAYER_SORTING_ORDERS);
30+
}
31+
32+
protected override void GetDrawers(LayerDefinition[] defs, List<LDtkContentDrawer<LayerDefinition>> drawers)
33+
{
34+
for (var i = 0; i < defs.Length; i++)
35+
{
36+
LDtkDrawerLayerCustomSortingOrder drawer =
37+
new LDtkDrawerLayerCustomSortingOrder(defs[i], ArrayProp.GetArrayElementAtIndex(i));
38+
39+
drawers.Add(drawer);
40+
}
41+
}
42+
43+
protected override void DrawDropdownContent()
44+
{
45+
EditorGUILayout.PropertyField(_useProp, _usePropLabel);
46+
using (new EditorGUI.DisabledScope(!_useProp.boolValue))
47+
{
48+
base.DrawDropdownContent();
49+
}
50+
}
51+
52+
protected override SerializedProperty GetKeyPropForElement(SerializedProperty element)
53+
{
54+
return element.FindPropertyRelative(LDtkLayerCustomSortingOrder.NAME);
55+
}
56+
57+
protected override SerializedProperty GetValuePropForElement(SerializedProperty element)
58+
{
59+
return element.FindPropertyRelative(LDtkLayerCustomSortingOrder.ORDER);
60+
}
61+
62+
protected override void SetDefaultElementValue(SerializedProperty insertedValueProp, int i)
63+
{
64+
insertedValueProp.intValue = -i;
65+
}
66+
}
67+
}

Assets/LDtkUnity/Editor/CustomEditor/SectionDrawers/LDtkSectionLayerCustomSortingOrder.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/LDtkUnity/Editor/CustomEditor/SectionDrawers/LDtkSectionMain.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ protected override void DrawDropdownContent()
107107
DrawField(CreateLevelBoundsTrigger, LDtkProjectImporter.CREATE_LEVEL_BOUNDS_TRIGGER);
108108
DrawField(UseParallax, LDtkProjectImporter.USE_PARALLAX);
109109
DrawField(ScaleEntities, LDtkProjectImporter.SCALE_ENTITIES);
110-
110+
111111
Editor.DrawDependenciesProperty();
112112
}
113113

0 commit comments

Comments
 (0)