Unity 編輯器十二 EditorPrefs屋彪、Undo所宰、GUIStyle、GUISkin畜挥、AssetPostprocessor

參考
【Unity 編輯器】擴(kuò)展總結(jié)八:EditorPrefs仔粥、ScriptableObject、Undo
【Unity 編輯器】擴(kuò)展總結(jié)九:GUIStyle蟹但、GUISkin
【Unity編輯器】擴(kuò)展總結(jié)十:AssetPostprocessor資源導(dǎo)入管線

一躯泰、EditorPrefs

Unity編輯器為開發(fā)者提供了類似PlayerPrefs的數(shù)據(jù)保存方式EditorPrefs。EditorPrefs是適用于編輯器模式华糖,而PlayerPrefs適用于游戲運(yùn)行時(shí)麦向。

EditorPrefs提供了四種數(shù)據(jù)的保存:int,float,string,bool。通過Set方法保存數(shù)據(jù)客叉,下次則通過Get方法來獲取數(shù)據(jù)诵竭,HasKey方法可以判斷是否存在該數(shù)據(jù)的保存,刪除數(shù)據(jù)調(diào)用DeleteKey方法即可兼搏。

using UnityEngine;
using UnityEditor;

public class WindowExample2 : EditorWindow
{
    private static WindowExample2 window;//窗體實(shí)例
    private string tempMsg;

    //顯示窗體
    [MenuItem("MyWindow/Second Window")] 
    private static void ShowWindow()
    {
        window = EditorWindow.GetWindow<WindowExample2>("Window Example");
        window.Show();
    }

    private void OnEnable()
    {
        if (EditorPrefs.HasKey("TempMsg"))
        {
            tempMsg = EditorPrefs.GetString("TempMsg");
        }
    }

    private void OnGUI()
    {
        tempMsg = EditorGUILayout.TextField("Temp Msg", tempMsg);
        if (GUILayout.Button("Save"))
        {
            EditorPrefs.SetString("TempMsg", tempMsg);
        }
    }
}

注意:需要謹(jǐn)慎調(diào)用EditorPrefs.DeleteAll()方法卵慰,因?yàn)樵摲椒ㄟ€可能會(huì)刪除Unity編輯器自身存儲(chǔ)的一些數(shù)據(jù),給開發(fā)者帶來不必要的麻煩佛呻。

二裳朋、Undo

Undo用于編輯器模式下的撤銷操作,這里介紹幾種常用的API吓著。

  • Undo.RegisterCreatedObjectUndo : 記錄新建的對(duì)象狀態(tài)鲤嫡,可以撤銷新建的對(duì)象
  • Undo.RecordObject:記錄對(duì)象的狀態(tài),需要在修改之前調(diào)用
  • Undo.AddComponent:可以撤銷新掛載的組件
  • Undo.DestroyObjectImmediate:可以撤銷刪除對(duì)象的操作
  • Undo.SetTransformParent:可以撤銷修改父對(duì)象的操作

示例:


image.png
using UnityEditor;
using UnityEngine;

public class UndoTest
{
    [MenuItem("Tools/Create Obj")]
    private static void CreateObj()
    {
        GameObject newObj = new GameObject("Undo");
        Undo.RegisterCreatedObjectUndo(newObj, "CreateObj");
    }

    [MenuItem("Tools/Move Obj")]
    private static void MoveObj() 
    {
        //獲取選中的場景對(duì)象
        Transform trans = Selection.activeGameObject.transform;
        if (trans)
        {
            Undo.RecordObject(trans, "MoveObj");
            trans.position += Vector3.up;
        }
    }

    [MenuItem("Tools/AddComponent Obj")]
    private static void AddComponentObj() 
    {
        //獲取選中的場景對(duì)象
        GameObject selectedObj = Selection.activeGameObject;
        if (selectedObj)
        {
            Undo.AddComponent(selectedObj,typeof(Rigidbody));
        }
    }

    [MenuItem("Tools/Destroy Obj")]
    private static void DestroyObj()
    {
        //獲取選中的場景對(duì)象
        GameObject selectedObj = Selection.activeGameObject;
        if (selectedObj)
        {
            Undo.DestroyObjectImmediate(selectedObj);
        }
    }

    [MenuItem("Tools/SetParent Obj")]
    private static void SetParentObj()
    {
        //獲取選中的場景對(duì)象
        Transform trans = Selection.activeGameObject.transform;
        Transform root = Camera.main.transform;
        if (trans)
        {
            Undo.SetTransformParent(trans, root, trans.name);
        }
    }
}
三绑莺、GUIStyle

GUIStyle用于修改GUI的風(fēng)格樣式泛范,除了適用于編輯器開發(fā),也適用于Unity舊版的UI系統(tǒng)(IMGUI)紊撕。GUIStyleu擁有多種屬性罢荡,可以方便開發(fā)者自定義編輯器UI樣式。當(dāng)我們未自定義GUIStyle時(shí)对扶,使用的就是unity默認(rèn)的GUIStyle樣式区赵。GUIStyle有點(diǎn)像網(wǎng)頁前端開發(fā)的層疊樣式表CSS,擁有很多狀態(tài)屬性可以調(diào)整浪南。(unity2019之后新出的UIElement模塊中的USS就更像是CSS了)

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Test))]
public class TestEditor : Editor
{
    private GUIStyle _titleStyle;

    private void OnEnable()
    {
        _titleStyle = new GUIStyle();
        _titleStyle.fontStyle = FontStyle.Bold;
        _titleStyle.fontSize = 20;
    }

    public override void OnInspectorGUI()
    {
        //使用Unity默認(rèn)的Label樣式
        EditorGUILayout.LabelField("GUIStyle");
        //使用自定義的Label樣式
        EditorGUILayout.LabelField("GUIStyle", _titleStyle);
    }
}
四笼才、GUISkin

GUISkin是基本所有樣式的集合,可以作為一種配置資源络凿。如果開發(fā)者需要自定義大量的GUIStyle骡送,可以通過GUISkin配置資源來定義昂羡,并且開發(fā)者可以在Inspector面板中直接修改樣式。

在Project面板摔踱,鼠標(biāo)右鍵Create-GUISkin既可以創(chuàng)建虐先。可以將新建的GUISkin資源放在Editor里的Resources文件內(nèi)派敷,方便動(dòng)態(tài)加載蛹批。

五、AssetPostprocessor
1.一些常用的方法如下:
  • OnPreprocessTexture:在導(dǎo)入紋理貼圖之前調(diào)用
  • OnPreprocessModel:在導(dǎo)入模型之前調(diào)用
  • OnPreprocessAudio:在導(dǎo)入音頻之前調(diào)用
  • OnPostprocessTexture:在導(dǎo)入紋理貼圖之后調(diào)用
  • OnPostprocessModel:在導(dǎo)入模型之后調(diào)用
  • OnPostprocessAudio:在導(dǎo)入音頻之后調(diào)用
  • OnPostprocessAllAssets:所有資源的導(dǎo)入篮愉,刪除腐芍,移動(dòng)操作都會(huì)調(diào)用該方法
2.示例,對(duì)導(dǎo)入的紋理貼圖資源進(jìn)行一定的自動(dòng)設(shè)置

注意:對(duì)圖片紋理的設(shè)置需要放在OnPreprocessTexture方法中執(zhí)行

using UnityEngine;
using UnityEditor;

public class AssetsImport : AssetPostprocessor
{
    private void OnPreprocessTexture()
    {
        Debug.Log("OnPreprocessTexture:" + this.assetPath);
        TextureImporter importer = this.assetImporter as TextureImporter;
        importer.textureType = TextureImporterType.Sprite;
        importer.maxTextureSize = 512;
        importer.mipmapEnabled = false;
    }

    public void OnPostprocessTexture(Texture2D tex)
    {
        Debug.Log("OnPostprocessTexture:" + this.assetPath);
    }
}

效果如下:
添加腳本前導(dǎo)入圖片:


image.png

添加腳本后導(dǎo)入圖片:


image.png

顯示的日志信息:
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末试躏,一起剝皮案震驚了整個(gè)濱河市猪勇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颠蕴,老刑警劉巖泣刹,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異裁替,居然都是意外死亡项玛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門弱判,熙熙樓的掌柜王于貴愁眉苦臉地迎上來襟沮,“玉大人,你說我怎么就攤上這事昌腰】” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵遭商,是天一觀的道長固灵。 經(jīng)常有香客問我,道長劫流,這世上最難降的妖魔是什么巫玻? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮祠汇,結(jié)果婚禮上仍秤,老公的妹妹穿的比我還像新娘。我一直安慰自己可很,他們只是感情好诗力,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著我抠,像睡著了一般苇本。 火紅的嫁衣襯著肌膚如雪袜茧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天瓣窄,我揣著相機(jī)與錄音笛厦,去河邊找鬼。 笑死康栈,一個(gè)胖子當(dāng)著我的面吹牛递递,可吹牛的內(nèi)容都是我干的喷橙。 我是一名探鬼主播啥么,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贰逾!你這毒婦竟也來了悬荣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤疙剑,失蹤者是張志新(化名)和其女友劉穎氯迂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體言缤,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嚼蚀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了管挟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轿曙。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖僻孝,靈堂內(nèi)的尸體忽然破棺而出导帝,到底是詐尸還是另有隱情,我是刑警寧澤穿铆,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布您单,位于F島的核電站,受9級(jí)特大地震影響荞雏,放射性物質(zhì)發(fā)生泄漏虐秦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一凤优、第九天 我趴在偏房一處隱蔽的房頂上張望悦陋。 院中可真熱鬧,春花似錦别洪、人聲如沸叨恨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痒钝。三九已至秉颗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間送矩,已是汗流浹背蚕甥。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栋荸,地道東北人菇怀。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像晌块,于是被迫代替她去往敵國和親爱沟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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