Odin Inspector 系列教程 --- 初識 OdinWindow

筆者以往在使用一些插件的時候經(jīng)常會看上面這種多炫酷的插件操作界面,常常羨慕不已,如今有了Odin,自己也可以簡簡單單的實現(xiàn)這些炫酷的效果了跃捣,下面筆者就帶大家初識OdinWindow。


創(chuàng)建一個Window

不積跬步無以至千里夺蛇,我們先從最簡單的創(chuàng)建一個Window開始,只需要自定義一類并繼承OdinEditorWindow即可

public class MySimpleEditorWindow : OdinEditorWindow
{
    [MenuItem("My Game/My Simple Editor")]
    private static void OpenWindow()
    {
        GetWindow<MySimpleEditorWindow>().Show();
    }

    public string Hello = "菜鳥海瀾";
}

混合Window

完成第一步后疚漆,我們可以根據(jù)筆者Odin主頁中的特性來填充這個Window了

public class MyHybridEditorWindowOne : OdinEditorWindow
{
    [MenuItem("My Game/My Hybrid Editor")]
    private static void OpenWindow()
    {
        GetWindow<MyHybridEditorWindowOne>().Show();
    }

    [EnumToggleButtons, BoxGroup("Settings")]
    public ScaleMode ScaleMode;

    [FolderPath(RequireExistingPath = true), BoxGroup("Settings")]
    public string OutputPath;

    
    [HorizontalGroup(0.5f)]//占比0.5
    public List<Texture> InputTextures;

    [HorizontalGroup, InlineEditor(InlineEditorModes.LargePreview)]
    public Texture Preview;

    [Button(ButtonSizes.Gigantic), GUIColor(0, 1, 0)]
    public void PerformSomeAction()
    {

    }
}
using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;


/*
 * 通過從OdinEditorWindow而不是EditorWindow繼承,您可以使Unity編輯器窗口的方式與創(chuàng)建檢查器的方式完全相同:僅使用屬性刁赦。

提示:您可以使用 OnInspectorGUI 屬性娶聘,如果您希望將自定義編輯器IMGUI代碼與Odin繪制的編輯器混合使用
 */
public class SomeWindow : OdinEditorWindow
{
    [MenuItem("My Game/My Window")]
    private static void OpenWindow()
    {
        GetWindow<SomeWindow>().Show();
    }

    [PropertyOrder(-10)]
    [HorizontalGroup]
    [Button(ButtonSizes.Large)]
    public void SomeButton1() { }

    [HorizontalGroup]
    [Button(ButtonSizes.Large)]
    public void SomeButton2() { }

    [HorizontalGroup]
    [Button(ButtonSizes.Large)]
    public void SomeButton3() { }

    [HorizontalGroup]
    [Button(ButtonSizes.Large), GUIColor(0, 1, 0)]
    public void SomeButton4() { }

    [HorizontalGroup]
    [Button(ButtonSizes.Large), GUIColor(1, 0.5f, 0)]
    public void SomeButton5() { }

    [TableList]
    public List<SomeType> SomeTableData;
}

public class SomeType
{
    [TableColumnWidth(50)]
    public bool Toggle;

    [AssetsOnly]
    public GameObject SomePrefab;

    public string Message;

    [TableColumnWidth(160)]
    [HorizontalGroup("Actions")]
    public void Test1() { }

    [HorizontalGroup("Actions")]
    public void Test2() { }
}

使用OdinMenuEditorWindow保持井井有條

這個就厲害了,一個Window集成數(shù)個功能甚脉,讓每個功能以菜單的形式進行選擇并顯示丸升。
這里需要注意的是,這次并不是繼承OdinEditorWindow牺氨,而是繼承OdinMenuEditorWindow狡耻,并使用OdinMenuTree中的AddAddAllAssetsAtPath函數(shù)添加菜單

  • Add: 設(shè)置菜單名稱并傳入對應(yīng)需要渲染的類
  • AddAllAssetsAtPath:設(shè)置菜單名稱,傳入路徑猴凹,示例中的第一個bool是指是否包含子路徑酝豪,第二bool表示是否子路徑的所有可用類都在一個層級中渲染。選擇false就是下面這種形式
using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;

public class MyMenuEditorWindow : OdinMenuEditorWindow
{
    [MenuItem("My Game/My Menu Editor")]
    private static void OpenWindow()
    {
        GetWindow<MyMenuEditorWindow>().Show();
    }

    protected override OdinMenuTree BuildMenuTree()
    {
        var tree = new OdinMenuTree();
        tree.Selection.SupportsMultiSelect = false;

        tree.Add("Settings", GeneralDrawerConfig.Instance);
        tree.Add("Utilities", new TextureUtilityEditor());
        tree.AddAllAssetsAtPath("Odin Settings", "Assets/Plugins/Sirenix", typeof(ScriptableObject), true, true);
        return tree;
    }
}

public class TextureUtilityEditor
{
    [BoxGroup("Tool"), HideLabel, EnumToggleButtons]
    public Tool Tool;

    public List<Texture> Textures;

    [Button(ButtonSizes.Large), HideIf("Tool", Tool.Rotate)]
    public void SomeAction() { }

    [Button(ButtonSizes.Large), ShowIf("Tool", Tool.Rotate)]
    public void SomeOtherAction() { }
}

功能強大且可自定義的OdinMenuTrees

public class MyTreeEditorWindow : OdinMenuEditorWindow
{
    [MenuItem("My Game/My Tree Editor")]
    private static void OpenWindow()
    {
        GetWindow<MyTreeEditorWindow>().Show();
    }

    protected override OdinMenuTree BuildMenuTree()
    {
        var tree = new OdinMenuTree();
        tree.DefaultMenuStyle = OdinMenuStyle.TreeViewStyle;

        tree.Add("Menu Style", tree.DefaultMenuStyle);

        var allAssets = AssetDatabase.GetAllAssetPaths()
            .Where(x => x.StartsWith("Assets/"))
            .OrderBy(x => x);

        foreach (var path in allAssets)
        {
            tree.AddAssetAtPath(path.Substring("Assets/".Length), path);
        }

        tree.EnumerateTree().AddThumbnailIcons();

        return tree;
    }
}

在編輯器窗口中渲染實例對象

您可以覆蓋GetTarget方法精堕,并給它任何類型的實例來呈現(xiàn)孵淘。

public class MyTargetEditorWindow : OdinEditorWindow
{
    [MenuItem("My Game/My Target Editor")]
    private static void OpenWindow()
    {
        GetWindow<MyTargetEditorWindow>().Show();
    }

    protected override void Initialize()
    {
        this.WindowPadding = Vector4.zero;
    }

    protected override object GetTarget()
    {
        return Selection.activeObject;
    }
}

更多教程內(nèi)容詳見:革命性Unity 編輯器擴展工具 --- Odin Inspector 系列教程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市歹篓,隨后出現(xiàn)的幾起案子瘫证,更是在濱河造成了極大的恐慌揉阎,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件背捌,死亡現(xiàn)場離奇詭異毙籽,居然都是意外死亡,警方通過查閱死者的電腦和手機毡庆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門坑赡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人么抗,你說我怎么就攤上這事毅否。” “怎么了蝇刀?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵螟加,是天一觀的道長。 經(jīng)常有香客問我吞琐,道長捆探,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任站粟,我火速辦了婚禮黍图,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奴烙。我一直安慰自己雌隅,他們只是感情好,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布缸沃。 她就那樣靜靜地躺著,像睡著了一般修械。 火紅的嫁衣襯著肌膚如雪趾牧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天肯污,我揣著相機與錄音翘单,去河邊找鬼。 笑死蹦渣,一個胖子當著我的面吹牛哄芜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柬唯,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼认臊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锄奢?” 一聲冷哼從身側(cè)響起失晴,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤剧腻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后涂屁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體书在,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年拆又,在試婚紗的時候發(fā)現(xiàn)自己被綠了儒旬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡帖族,死狀恐怖栈源,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盟萨,我是刑警寧澤凉翻,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站捻激,受9級特大地震影響制轰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胞谭,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一垃杖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丈屹,春花似錦调俘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至先蒋,卻和暖如春骇钦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背竞漾。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工眯搭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人业岁。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓鳞仙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親笔时。 傳聞我的和親對象是個殘疾皇子棍好,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 前言:Odin Inspector是Unity的一個插件,讓您可以享受擁有強大,自定義和用戶友好編輯器的所有工作流...
    su9257_海瀾閱讀 48,391評論 13 64
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,096評論 1 32
  • 春分者梳玫,陰陽相半也爹梁,故晝夜均而寒暑平。 春分提澎,太陽直射地球赤道姚垃,白晝黑夜等長。 意樹對凡是帶有“分”字的節(jié)氣盼忌,似乎...
    意樹國風閱讀 271評論 0 0
  • 去年林銳闖入陳墨的生活积糯,林銳帥氣成熟溫暖有魅力,深深的吸引了陳墨谦纱,他們溝通了很多看成,不過大部分都是陳墨說,林銳聆聽跨嘉。...
    Ruby_1696閱讀 162評論 0 0
  • 終會有一天 你會發(fā)覺自己現(xiàn)在的所作所為都只會是徒勞 因為你只是得了空心病
    你妹的昵稱被使用閱讀 112評論 0 0