实现了一个地图编辑器,总体来说可以比较方便的从资产导入瓦片地图、修改、保存成资产了,编辑器界面如下。

资产的读取
加载瓦片地图的时候,需要从瓦片存放的文件夹中读取文件。一开始采用的LoadAssetAtPath函数,调试半天一直无法根据Tile名字和文件夹路径获取Tile资产。后切换了另一种实现方式,这个倒是一下就成功了。
string[] guids = AssetDatabase.FindAssets($"{tileName} t:TileBase", new[] { "Assets/Tilemap/Tile" });
TileBase tile = guids.Length > 0
? AssetDatabase.LoadAssetAtPath<TileBase>(AssetDatabase.GUIDToAssetPath(guids[0]))
: null;
EditorGUILayout、EditorGUI、GUILayout
三个都是GUI排版库,用于不同的场景。
| 类型 | 定位 | 使用场景 |
| GUILayout | 运行时/编辑器通用无脑排版 | 任何 `OnGUI`(MonoBehaviour 的 UI、运行时调试窗、编辑器) |
| EditorGUI | 编辑器精确定位的字段抽屉 | 需要指定矩形、做自定义 Inspector。无自动排版,需要自己设置Rect |
| EditorGUILayout | 编辑器自动布局的字段抽屉 | 做编辑器窗口/Inspector且不想自己算坐标 |
交错数组的序列化
交错数组天生不支持序列化,采用一个比较简单的方法实现,也就是内层数组用结构体再包裹一层,这样就可以比较方便的实现实例化,可以在Unity编辑器中修改数据了。
EditorUtility.SetDirty(obj)
在编辑器里,并不是一改就立即写盘;Unity 会批量延后保存,以提高性能。
如果你代码改了资产(ScriptableObject、Prefab、Mesh 等) 或场景里的对象,却不调用 SetDirty,Ctrl + S 时不会存盘,重启 Unity 就发现改动丢了。
所以修改代码修改资产的时候要声明这个。
4597

被折叠的 条评论
为什么被折叠?



