Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 1af0ae8

Browse files
johnsoncodehkChuanXin-Unity
authored andcommittedAug 10, 2018
* Add Rule Override Tile * Fix new override tile error * Add Rule Base RuleOverrideTile * Change RuleOverrideTile base class to TileBase This change allows RuleOverrideTile to use tile inherited from RuleTile, and to reduce the data stored by the asset. * Fix new RuleOverrideTile error when tile is empty and Advanced enabled * Customizable RuleTile * Fix base class RuleTile have not display tooltip
1 parent ebcc7fa commit 1af0ae8

File tree

8 files changed

+195
-62
lines changed

8 files changed

+195
-62
lines changed
 

‎Assets/Tilemap/Tiles/Rule Override Tile/Scripts/Editor/RuleOverrideTileEditor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ public void DrawOriginalRuleElement(Rect rect, RuleTile.TilingRule originalRule,
171171
RuleTileEditor.RuleInspectorOnGUI(inspectorRect, originalRule);
172172
else
173173
RuleOriginalDefaultInspectorOnGUI(inspectorRect, originalRule);
174-
RuleTileEditor.RuleMatrixOnGUI(matrixRect, originalRule);
174+
RuleTileEditor.RuleMatrixOnGUI(overrideTile.m_Tile, matrixRect, originalRule);
175175
RuleTileEditor.SpriteOnGUI(spriteRect, originalRule);
176176
}
177177
}

‎Assets/Tilemap/Tiles/Rule Tile/ScriptTemplates.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using UnityEngine;
4+
using UnityEngine.Tilemaps;
5+
6+
[CreateAssetMenu]
7+
public class #SCRIPTNAME# : RuleTile<#SCRIPTNAME#.Neighbor> {
8+
9+
public bool customField;
10+
11+
public class Neighbor : RuleTile.TilingRule.Neighbor {
12+
public const int Null = 3;
13+
public const int NotNull = 4;
14+
}
15+
16+
public override bool RuleMatch(int neighbor, TileBase tile) {
17+
switch (neighbor) {
18+
case Neighbor.Null: return tile == null;
19+
case Neighbor.NotNull: return tile != null;
20+
}
21+
return base.RuleMatch(neighbor, tile);
22+
}
23+
24+
#if UNITY_EDITOR
25+
public override void RuleOnGUI(Rect rect, Vector2Int pos, int neighbor) {
26+
base.RuleOnGUI(rect, pos, neighbor);
27+
}
28+
#endif
29+
}

‎Assets/Tilemap/Tiles/Rule Tile/ScriptTemplates/NewCustomRuleTile.cs.txt.meta

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
namespace UnityEditor
2+
{
3+
static class CustomRuleTileMenu
4+
{
5+
[MenuItem("Assets/Create/Custom Rule Tile Script", false, 89)]
6+
static void CreateCustomRuleTile()
7+
{
8+
CreateScriptAsset("Assets/Tilemap/Tiles/Rule Tile/ScriptTemplates/NewCustomRuleTile.cs.txt", "NewCustomRuleTile.cs");
9+
}
10+
static void CreateScriptAsset(string templatePath, string destName)
11+
{
12+
typeof(ProjectWindowUtil)
13+
.GetMethod("CreateScriptAsset", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic)
14+
.Invoke(null, new object[] { templatePath, destName });
15+
}
16+
}
17+
}

‎Assets/Tilemap/Tiles/Rule Tile/Scripts/Editor/CustomRuleTileMenu.cs.meta

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

‎Assets/Tilemap/Tiles/Rule Tile/Scripts/Editor/RuleTileEditor.cs

Lines changed: 22 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Reflection;
4+
using System.Linq;
45
using UnityEditor.Sprites;
56
using UnityEditorInternal;
67
using UnityEngine;
@@ -10,44 +11,13 @@
1011

1112
namespace UnityEditor
1213
{
13-
[CustomEditor(typeof(RuleTile))]
14+
[CustomEditor(typeof(RuleTile), true)]
1415
[CanEditMultipleObjects]
1516
internal class RuleTileEditor : Editor
1617
{
17-
private const string s_XIconString = "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuNWWFMmUAAABoSURBVDhPnY3BDcAgDAOZhS14dP1O0x2C/LBEgiNSHvfwyZabmV0jZRUpq2zi6f0DJwdcQOEdwwDLypF0zHLMa9+NQRxkQ+ACOT2STVw/q8eY1346ZlE54sYAhVhSDrjwFymrSFnD2gTZpls2OvFUHAAAAABJRU5ErkJggg==";
18-
private const string s_Arrow0 = "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuNWWFMmUAAACYSURBVDhPzZExDoQwDATzE4oU4QXXcgUFj+YxtETwgpMwXuFcwMFSRMVKKwzZcWzhiMg91jtg34XIntkre5EaT7yjjhI9pOD5Mw5k2X/DdUwFr3cQ7Pu23E/BiwXyWSOxrNqx+ewnsayam5OLBtbOGPUM/r93YZL4/dhpR/amwByGFBz170gNChA6w5bQQMqramBTgJ+Z3A58WuWejPCaHQAAAABJRU5ErkJggg==";
19-
private const string s_Arrow1 = "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuNWWFMmUAAABqSURBVDhPxYzBDYAgEATpxYcd+PVr0fZ2siZrjmMhFz6STIiDs8XMlpEyi5RkO/d66TcgJUB43JfNBqRkSEYDnYjhbKD5GIUkDqRDwoH3+NgTAw+bL/aoOP4DOgH+iwECEt+IlFmkzGHlAYKAWF9R8zUnAAAAAElFTkSuQmCC";
20-
private const string s_Arrow2 = "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuNWWFMmUAAAC0SURBVDhPjVE5EsIwDMxPKFKYF9CagoJH8xhaMskLmEGsjOSRkBzYmU2s9a58TUQUmCH1BWEHweuKP+D8tphrWcAHuIGrjPnPNY8X2+DzEWE+FzrdrkNyg2YGNNfRGlyOaZDJOxBrDhgOowaYW8UW0Vau5ZkFmXbbDr+CzOHKmLinAXMEePyZ9dZkZR+s5QX2O8DY3zZ/sgYcdDqeEVp8516o0QQV1qeMwg6C91toYoLoo+kNt/tpKQEVvFQAAAAASUVORK5CYII=";
21-
private const string s_Arrow3 = "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuNWWFMmUAAAB2SURBVDhPzY1LCoAwEEPnLi48gW5d6p31bH5SMhp0Cq0g+CCLxrzRPqMZ2pRqKG4IqzJc7JepTlbRZXYpWTg4RZE1XAso8VHFKNhQuTjKtZvHUNCEMogO4K3BhvMn9wP4EzoPZ3n0AGTW5fiBVzLAAYTP32C2Ay3agtu9V/9PAAAAAElFTkSuQmCC";
22-
private const string s_Arrow5 = "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuNWWFMmUAAABqSURBVDhPnY3BCYBADASvFx924NevRdvbyoLBmNuDJQMDGjNxAFhK1DyUQ9fvobCdO+j7+sOKj/uSB+xYHZAxl7IR1wNTXJeVcaAVU+614uWfCT9mVUhknMlxDokd15BYsQrJFHeUQ0+MB5ErsPi/6hO1AAAAAElFTkSuQmCC";
23-
private const string s_Arrow6 = "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuNWWFMmUAAACaSURBVDhPxZExEkAwEEVzE4UiTqClUDi0w2hlOIEZsV82xCZmQuPPfFn8t1mirLWf7S5flQOXjd64vCuEKWTKVt+6AayH3tIa7yLg6Qh2FcKFB72jBgJeziA1CMHzeaNHjkfwnAK86f3KUafU2ClHIJSzs/8HHLv09M3SaMCxS7ljw/IYJWzQABOQZ66x4h614ahTCL/WT7BSO51b5Z5hSx88AAAAAElFTkSuQmCC";
24-
private const string s_Arrow7 = "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuNWWFMmUAAABQSURBVDhPYxh8QNle/T8U/4MKEQdAmsz2eICx6W530gygr2aQBmSMphkZYxqErAEXxusKfAYQ7XyyNMIAsgEkaYQBkAFkaYQBsjXSGDAwAAD193z4luKPrAAAAABJRU5ErkJggg==";
25-
private const string s_Arrow8 = "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuNWWFMmUAAACYSURBVDhPxZE9DoAwCIW9iUOHegJXHRw8tIdx1egJTMSHAeMPaHSR5KVQ+KCkCRF91mdz4VDEWVzXTBgg5U1N5wahjHzXS3iFFVRxAygNVaZxJ6VHGIl2D6oUXP0ijlJuTp724FnID1Lq7uw2QM5+thoKth0N+GGyA7IA3+yM77Ag1e2zkey5gCdAg/h8csy+/89v7E+YkgUntOWeVt2SfAAAAABJRU5ErkJggg==";
2618
private const string s_MirrorX = "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwQAADsEBuJFr7QAAABh0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC41ZYUyZQAAAG1JREFUOE+lj9ENwCAIRB2IFdyRfRiuDSaXAF4MrR9P5eRhHGb2Gxp2oaEjIovTXSrAnPNx6hlgyCZ7o6omOdYOldGIZhAziEmOTSfigLV0RYAB9y9f/7kO8L3WUaQyhCgz0dmCL9CwCw172HgBeyG6oloC8fAAAAAASUVORK5CYII=";
2719
private const string s_MirrorY = "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwgAADsIBFShKgAAAABh0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC41ZYUyZQAAAG9JREFUOE+djckNACEMAykoLdAjHbPyw1IOJ0L7mAejjFlm9hspyd77Kk+kBAjPOXcakJIh6QaKyOE0EB5dSPJAiUmOiL8PMVGxugsP/0OOib8vsY8yYwy6gRyC8CB5QIWgCMKBLgRSkikEUr5h6wOPWfMoCYILdgAAAABJRU5ErkJggg==";
2820
private const string s_Rotated = "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwQAADsEBuJFr7QAAABh0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC41ZYUyZQAAAHdJREFUOE+djssNwCAMQxmIFdgx+2S4Vj4YxWlQgcOT8nuG5u5C732Sd3lfLlmPMR4QhXgrTQaimUlA3EtD+CJlBuQ7aUAUMjEAv9gWCQNEPhHJUkYfZ1kEpcxDzioRzGIlr0Qwi0r+Q5rTgM+AAVcygHgt7+HtBZs/2QVWP8ahAAAAAElFTkSuQmCC";
29-
30-
private static Texture2D[] s_Arrows;
31-
public static Texture2D[] arrows
32-
{
33-
get
34-
{
35-
if (s_Arrows == null)
36-
{
37-
s_Arrows = new Texture2D[10];
38-
s_Arrows[0] = Base64ToTexture(s_Arrow0);
39-
s_Arrows[1] = Base64ToTexture(s_Arrow1);
40-
s_Arrows[2] = Base64ToTexture(s_Arrow2);
41-
s_Arrows[3] = Base64ToTexture(s_Arrow3);
42-
s_Arrows[5] = Base64ToTexture(s_Arrow5);
43-
s_Arrows[6] = Base64ToTexture(s_Arrow6);
44-
s_Arrows[7] = Base64ToTexture(s_Arrow7);
45-
s_Arrows[8] = Base64ToTexture(s_Arrow8);
46-
s_Arrows[9] = Base64ToTexture(s_XIconString);
47-
}
48-
return s_Arrows;
49-
}
50-
}
5121

5222
private static Texture2D[] s_AutoTransforms;
5323
public static Texture2D[] autoTransforms
@@ -57,9 +27,9 @@ public static Texture2D[] autoTransforms
5727
if (s_AutoTransforms == null)
5828
{
5929
s_AutoTransforms = new Texture2D[3];
60-
s_AutoTransforms[0] = Base64ToTexture(s_Rotated);
61-
s_AutoTransforms[1] = Base64ToTexture(s_MirrorX);
62-
s_AutoTransforms[2] = Base64ToTexture(s_MirrorY);
30+
s_AutoTransforms[0] = RuleTile.Base64ToTexture(s_Rotated);
31+
s_AutoTransforms[1] = RuleTile.Base64ToTexture(s_MirrorX);
32+
s_AutoTransforms[2] = RuleTile.Base64ToTexture(s_MirrorY);
6333
}
6434
return s_AutoTransforms;
6535
}
@@ -121,7 +91,7 @@ private void OnDrawElement(Rect rect, int index, bool isactive, bool isfocused)
12191

12292
EditorGUI.BeginChangeCheck();
12393
RuleInspectorOnGUI(inspectorRect, rule);
124-
RuleMatrixOnGUI(matrixRect, rule);
94+
RuleMatrixOnGUI(tile, matrixRect, rule);
12595
SpriteOnGUI(spriteRect, rule);
12696
if (EditorGUI.EndChangeCheck())
12797
SaveTile();
@@ -151,13 +121,19 @@ public override void OnInspectorGUI()
151121
{
152122
tile.m_DefaultSprite = EditorGUILayout.ObjectField("Default Sprite", tile.m_DefaultSprite, typeof(Sprite), false) as Sprite;
153123
tile.m_DefaultColliderType = (Tile.ColliderType)EditorGUILayout.EnumPopup("Default Collider", tile.m_DefaultColliderType);
124+
125+
var baseFields = typeof(RuleTile).GetFields().Select(field => field.Name);
126+
var fields = target.GetType().GetFields().Select(field => field.Name).Where(field => !baseFields.Contains(field));
127+
foreach (var field in fields)
128+
EditorGUILayout.PropertyField(serializedObject.FindProperty(field), true);
129+
154130
EditorGUILayout.Space();
155131

156132
if (m_ReorderableList != null && tile.m_TilingRules != null)
157133
m_ReorderableList.DoLayoutList();
158134
}
159135

160-
internal static void RuleMatrixOnGUI(Rect rect, RuleTile.TilingRule tilingRule)
136+
internal static void RuleMatrixOnGUI(RuleTile tile, Rect rect, RuleTile.TilingRule tilingRule)
161137
{
162138
Handles.color = EditorGUIUtility.isProSkin ? new Color(1f, 1f, 1f, 0.2f) : new Color(0f, 0f, 0f, 0.2f);
163139
int index = 0;
@@ -183,21 +159,20 @@ internal static void RuleMatrixOnGUI(Rect rect, RuleTile.TilingRule tilingRule)
183159
Rect r = new Rect(rect.xMin + x * w, rect.yMin + y * h, w - 1, h - 1);
184160
if (x != 1 || y != 1)
185161
{
186-
switch (tilingRule.m_Neighbors[index])
187-
{
188-
case RuleTile.TilingRule.Neighbor.This:
189-
GUI.DrawTexture(r, arrows[y*3 + x]);
190-
break;
191-
case RuleTile.TilingRule.Neighbor.NotThis:
192-
GUI.DrawTexture(r, arrows[9]);
193-
break;
194-
}
162+
tile.RuleOnGUI(r, new Vector2Int(x, y), tilingRule.m_Neighbors[index]);
195163
if (Event.current.type == EventType.MouseDown && r.Contains(Event.current.mousePosition))
196164
{
197165
int change = 1;
198166
if (Event.current.button == 1)
199167
change = -1;
200-
tilingRule.m_Neighbors[index] = (RuleTile.TilingRule.Neighbor) (((int)tilingRule.m_Neighbors[index] + change) % 3);
168+
169+
var allConsts = tile.m_NeighborType.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
170+
var neighbors = allConsts.Select(c => (int)c.GetValue(null)).ToList();
171+
neighbors.Sort();
172+
173+
int oldIndex = neighbors.IndexOf(tilingRule.m_Neighbors[index]);
174+
int newIndex = (int)Mathf.Repeat(oldIndex + change, neighbors.Count);
175+
tilingRule.m_Neighbors[index] = neighbors[newIndex];
201176
GUI.changed = true;
202177
Event.current.Use();
203178
}
@@ -351,14 +326,6 @@ private static Type GetType(string TypeName)
351326
}
352327
return null;
353328
}
354-
355-
private static Texture2D Base64ToTexture(string base64)
356-
{
357-
Texture2D t = new Texture2D(1, 1);
358-
t.hideFlags = HideFlags.HideAndDontSave;
359-
t.LoadImage(System.Convert.FromBase64String(base64));
360-
return t;
361-
}
362329

363330
[Serializable]
364331
class RuleTileRuleWrapper
There was a problem loading the remainder of the diff.

0 commit comments

Comments
 (0)
Failed to load comments.