Odin Inspector 系列教程 --- 自定義 Value Drawer

本次講解的是對(duì)應(yīng)我們自己編寫的類或者結(jié)構(gòu)體耕腾,按照需求自定義Drawer的簡(jiǎn)單示例

Value Drawer是Odin最基本的Drawer型,通常是最終在檢查員中完成屬性最終繪制的繪制敢艰。因此,它們通常位于繪制鏈中的最后一個(gè)抽屜中,通常不會(huì)延續(xù)該鏈兑凿。所以本示例不會(huì)出現(xiàn)this.CallNextDrawer(label);等字樣疤祭。

示例比較簡(jiǎn)單盼产,我們接下來分幾個(gè)步驟即可完成

創(chuàng)建我們的自定義類
    // 演示如何為自定義類型生成自定義drawer的示例。
    [TypeInfoBox("此示例演示如何為自定義結(jié)構(gòu)或類實(shí)現(xiàn)自定義drawer")]
    public class CustomDrawerExample : MonoBehaviour
    {
        public MyStruct MyStruct;
        [ShowInInspector]
        public static float labelWidth = 10;
    }

    // 自定義數(shù)據(jù)結(jié)構(gòu)画株,用于演示辆飘。
    [Serializable]
    public struct MyStruct
    {
        public float X;
        public float Y;
    }
創(chuàng)建一個(gè)用于繪制MyStruct的Darwe類

此繪制類需要繼承OdinValueDrawer,并傳入對(duì)應(yīng)的類型

    public class CustomStructDrawer : OdinValueDrawer<MyStruct>
    {

    }
開始繪制

準(zhǔn)備工作完成谓传,接下來開始真正的繪制,這里我們需要重寫DrawPropertyLayout方法

        protected override void DrawPropertyLayout(GUIContent label)
        {
            
        }
繪制主要分為以下幾個(gè)步驟
  • 獲取我們繪制類的值
  • 獲取要繪制的區(qū)域(rect)
  • 保存原始labelWidth的寬度
  • 設(shè)定新的label寬度
  • 根據(jù)slider對(duì)應(yīng)的值進(jìn)行賦值
  • 恢復(fù)設(shè)定原始label寬度
  • 將新的Struct賦值給我們定義的MyStruct
        protected override void DrawPropertyLayout(GUIContent label)
        {
            //獲取我們繪制類的值
            MyStruct value = this.ValueEntry.SmartValue;

            //獲取要繪制的區(qū)域(rect)
            var rect = EditorGUILayout.GetControlRect();
            //在Odin中蜈项,標(biāo)簽是可選項(xiàng),可以為空续挟,所以我們必須考慮到這一點(diǎn)紧卒。
            if (label != null)
            {
                rect = EditorGUI.PrefixLabel(rect, label);
            }

            //保存原始labelWidth的寬度,此label為struct中對(duì)應(yīng)的X,Y
            var prev = EditorGUIUtility.labelWidth;

            //設(shè)定新的label寬度
            EditorGUIUtility.labelWidth = CustomDrawerExample.labelWidth;

            //根據(jù)slider對(duì)應(yīng)的值進(jìn)行賦值
            value.X = EditorGUI.Slider(rect.AlignLeft(rect.width * 0.5f), "X", value.X, 0, 1);
            value.Y = EditorGUI.Slider(rect.AlignRight(rect.width * 0.5f), "Y", value.Y, 0, 1);

            //恢復(fù)設(shè)定原始label寬度
            EditorGUIUtility.labelWidth = prev;

            //將新的Struct賦值給我們定義的MyStruct
            this.ValueEntry.SmartValue = value;
        }

完整示例代碼

#if UNITY_EDITOR
namespace Sirenix.OdinInspector.Demos
{
    using UnityEngine;
    using System;

#if UNITY_EDITOR

    using Sirenix.OdinInspector.Editor;
    using UnityEditor;
    using Sirenix.Utilities;

#endif

    // 演示如何為自定義類型生成自定義drawer的示例诗祸。
    [TypeInfoBox("此示例演示如何為自定義結(jié)構(gòu)或類實(shí)現(xiàn)自定義drawer")]
    public class CustomDrawerExample : MonoBehaviour
    {
        public MyStruct MyStruct;
        [ShowInInspector]
        public static float labelWidth = 10;
    }

    // 自定義數(shù)據(jù)結(jié)構(gòu)跑芳,用于演示。
    [Serializable]
    public struct MyStruct
    {
        public float X;
        public float Y;
    }

#if UNITY_EDITOR

    public class CustomStructDrawer : OdinValueDrawer<MyStruct>
    {
        protected override void DrawPropertyLayout(GUIContent label)
        {
            //獲取我們繪制類的值
            MyStruct value = this.ValueEntry.SmartValue;

            //獲取要繪制的區(qū)域(rect)
            var rect = EditorGUILayout.GetControlRect();
            //在Odin中直颅,標(biāo)簽是可選項(xiàng)博个,可以為空,所以我們必須考慮到這一點(diǎn)功偿。
            if (label != null)
            {
                rect = EditorGUI.PrefixLabel(rect, label);
            }

            //保存原始labelWidth的寬度盆佣,此label為struct中對(duì)應(yīng)的X,Y
            var prev = EditorGUIUtility.labelWidth;

            //設(shè)定新的label寬度
            EditorGUIUtility.labelWidth = CustomDrawerExample.labelWidth;

            //根據(jù)slider對(duì)應(yīng)的值進(jìn)行賦值
            value.X = EditorGUI.Slider(rect.AlignLeft(rect.width * 0.5f), "X", value.X, 0, 1);
            value.Y = EditorGUI.Slider(rect.AlignRight(rect.width * 0.5f), "Y", value.Y, 0, 1);

            //恢復(fù)設(shè)定原始label寬度
            EditorGUIUtility.labelWidth = prev;

            //將新的Struct賦值給我們定義的MyStruct
            this.ValueEntry.SmartValue = value;
        }
    }
#endif
}
#endif


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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市械荷,隨后出現(xiàn)的幾起案子共耍,更是在濱河造成了極大的恐慌,老刑警劉巖吨瞎,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痹兜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡颤诀,警方通過查閱死者的電腦和手機(jī)字旭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門对湃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谐算,你說我怎么就攤上這事熟尉。” “怎么了洲脂?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵斤儿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我恐锦,道長(zhǎng)往果,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任一铅,我火速辦了婚禮陕贮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘潘飘。我一直安慰自己肮之,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布卜录。 她就那樣靜靜地躺著戈擒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪艰毒。 梳的紋絲不亂的頭發(fā)上筐高,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音丑瞧,去河邊找鬼柑土。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绊汹,可吹牛的內(nèi)容都是我干的稽屏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼西乖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼诫欠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浴栽,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎轿偎,沒想到半個(gè)月后典鸡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坏晦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年萝玷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嫁乘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡球碉,死狀恐怖蜓斧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情睁冬,我是刑警寧澤挎春,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站豆拨,受9級(jí)特大地震影響直奋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜施禾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一脚线、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弥搞,春花似錦邮绿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至肛度,卻和暖如春傻唾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背承耿。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工冠骄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人加袋。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓凛辣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親职烧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扁誓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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