iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0
Software Development

如何在Unity裡寫出具有一定擴充性的遊戲系列 第 27

Day 27:Unity簡易編輯器製作(一)—使用Odin製作單位編輯面板

  • 分享至 

  • xImage
  •  

以一名具有效率(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的長相如下
https://ithelp.ithome.com.tw/upload/images/20221009/20151894iNQjItONUp.png

參考資料

Custom Editor Windows Made Easy with Odin Inspector
流離之歌


上一篇
Day 26:ScriptableObject簡介
下一篇
Day 28:Unity簡易編輯器製作(二)—使用Odin排版ScriptableObject
系列文
如何在Unity裡寫出具有一定擴充性的遊戲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言