以一名具有效率(X)想要偷懶(O)的程式來說,如果可以單位資料數值調整、單位位置擺放都企劃自己建,那為什麼不那樣做?
不過要製作到一個十分精美的編輯器本身需要花費十足的功夫,不是功能做出來就完事,本文章目前打算只做個簡易的編輯器
因為之後的專案想嘗試使用Odin來做為Inspector的排版,所以以下的範例會使用到Odin的程式碼,不過即使沒有Odin,還是可以用Unity內建的Visual element或IMGUI製作
UnitDataEditor.cs
using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor;
using Sirenix.Utilities.Editor;
using UnityEditor;
using UnityEngine;
namespace LinXuan.TBSF.Editor
{
public class UnitDataEditor : OdinMenuEditorWindow //OdinMenuEditorWindow是Oidn內建製作編輯器的相關程式,只要繼承就能擁有基本的編輯器介面
{
[MenuItem("TBSF/UnitDataEditor Editor")]
private static void OpenWindow()
{
GetWindow<UnitDataEditor>().Show();
}
private CreateNewUnitData createNewUnitData;
protected override void OnDestroy()
{
base.OnDestroy();
if (createNewUnitData != null)
DestroyImmediate(createNewUnitData.unitData); //馬上將createNewUnitData裡的unitData銷毀
}
protected override OdinMenuTree BuildMenuTree()
{
OdinMenuTree odinMenuTree = new OdinMenuTree(); //創造一個主選單,預測顯示在左側
createNewUnitData = new CreateNewUnitData();
odinMenuTree.Add("Create new unit data", createNewUnitData); ////新增一個名為Create new unit data的選項,裡面會顯示出CreateNewUnitData class的配置
odinMenuTree.AddAllAssetsAtPath("Unit Data", "Assets/Resources/ScriptableObject/UnitData", typeof(UnitData)); //新增一個名為Unit Data的選項,會依照裡面輸入的路徑顯示所有使用UnitData製作出來的ScriptableObject
return odinMenuTree;
}
protected override void OnBeginDrawEditors()
{
OdinMenuTreeSelection selected = this.MenuTree.Selection; //獲取目前的選擇
SirenixEditorGUI.BeginHorizontalToolbar(); //在這範圍內的選項會顯示在水平位置
{
GUILayout.FlexibleSpace();
if(SirenixEditorGUI.ToolbarButton("Delete current")) //如果點擊Delete current,此UnitData就會被刪除
{
UnitData unitData = selected.SelectedValue as UnitData;
string path = AssetDatabase.GetAssetPath(unitData);
AssetDatabase.DeleteAsset(path);
AssetDatabase.SaveAssets();
}
}
SirenixEditorGUI.EndHorizontalToolbar();
}
public class CreateNewUnitData
{
[InlineEditor(ObjectFieldMode = InlineEditorObjectFieldModes.Hidden)]
public UnitData unitData;
public CreateNewUnitData()
{
unitData = ScriptableObject.CreateInstance<UnitData>(); //產生一個新的UnitData實體
unitData.UnitName = "New Unit Name";
}
[Button("Add New Unit SO")]
private void CreateNewData()
{
AssetDatabase.CreateAsset(unitData, "Assets/Resources/ScriptableObject/UnitData/" + unitData.UnitName + ".asset"); //將實體存在指定位置
AssetDatabase.SaveAssets(); //要寫這段新創出來的UnitData才會真的被存起來
}
}
}
}
以上寫完後Unit Data Editor的長相如下
Custom Editor Windows Made Easy with Odin Inspector
流離之歌