ChuanXin 发表于 2021-12-14 21:17

Unity 编辑器十二 EditorPrefs、Undo、GUIStyle、GUISkin、AssetPostprocessor

参考
【Unity 编辑器】扩展总结八:EditorPrefs、ScriptableObject、Undo
【Unity 编辑器】扩展总结九:GUIStyle、GUISkin
【Unity编辑器】扩展总结十:AssetPostprocessor资源导入管线
一、EditorPrefs


Unity编辑器为开发者提供了类似PlayerPrefs的数据保存方式EditorPrefs。EditorPrefs是适用于编辑器模式,而PlayerPrefs适用于游戏运行时。

EditorPrefs提供了四种数据的保存:int,float,string,bool。通过Set方法保存数据,下次则通过Get方法来获取数据,HasKey方法可以判断是否存在该数据的保存,删除数据调用DeleteKey方法即可。
using UnityEngine;using UnityEditor;public class WindowExample2 : EditorWindow{    private static WindowExample2 window;//窗体实例    private string tempMsg;    //显示窗体       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);      }    }}
注意:需要谨慎调用EditorPrefs.DeleteAll()方法,因为该方法还可能会删除Unity编辑器自身存储的一些数据,给开发者带来不必要的麻烦。
二、Undo


Undo用于编辑器模式下的撤销操作,这里介绍几种常用的API。
Undo.RegisterCreatedObjectUndo : 记录新建的对象状态,可以撤销新建的对象Undo.RecordObject:记录对象的状态,需要在修改之前调用Undo.AddComponent:可以撤销新挂载的组件Undo.DestroyObjectImmediate:可以撤销删除对象的操作Undo.SetTransformParent:可以撤销修改父对象的操作

示例:


image.png

using UnityEditor;using UnityEngine;public class UndoTest{        private static void CreateObj()    {      GameObject newObj = new GameObject("Undo");      Undo.RegisterCreatedObjectUndo(newObj, "CreateObj");    }        private static void MoveObj()   {      //获取选中的场景对象      Transform trans = Selection.activeGameObject.transform;      if (trans)      {            Undo.RecordObject(trans, "MoveObj");            trans.position += Vector3.up;      }    }        private static void AddComponentObj()   {      //获取选中的场景对象      GameObject selectedObj = Selection.activeGameObject;      if (selectedObj)      {            Undo.AddComponent(selectedObj,typeof(Rigidbody));      }    }        private static void DestroyObj()    {      //获取选中的场景对象      GameObject selectedObj = Selection.activeGameObject;      if (selectedObj)      {            Undo.DestroyObjectImmediate(selectedObj);      }    }        private static void SetParentObj()    {      //获取选中的场景对象      Transform trans = Selection.activeGameObject.transform;      Transform root = Camera.main.transform;      if (trans)      {            Undo.SetTransformParent(trans, root, trans.name);      }    }}三、GUIStyle


GUIStyle用于修改GUI的风格样式,除了适用于编辑器开发,也适用于Unity旧版的UI系统(IMGUI)。GUIStyleu拥有多种属性,可以方便开发者自定义编辑器UI样式。当我们未自定义GUIStyle时,使用的就是unity默认的GUIStyle样式。GUIStyle有点像网页前端开发的层叠样式表CSS,拥有很多状态属性可以调整。(unity2019之后新出的UIElement模块中的USS就更像是CSS了)
using UnityEngine;using UnityEditor;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默认的Label样式      EditorGUILayout.LabelField("GUIStyle");      //使用自定义的Label样式      EditorGUILayout.LabelField("GUIStyle", _titleStyle);    }}四、GUISkin


GUISkin是基本所有样式的集合,可以作为一种配置资源。如果开发者需要自定义大量的GUIStyle,可以通过GUISkin配置资源来定义,并且开发者可以在Inspector面板中直接修改样式。

在Project面板,鼠标右键Create-GUISkin既可以创建。可以将新建的GUISkin资源放在Editor里的Resources文件内,方便动态加载。
五、AssetPostprocessor

1.一些常用的方法如下:

OnPreprocessTexture:在导入纹理贴图之前调用OnPreprocessModel:在导入模型之前调用OnPreprocessAudio:在导入音频之前调用OnPostprocessTexture:在导入纹理贴图之后调用OnPostprocessModel:在导入模型之后调用OnPostprocessAudio:在导入音频之后调用OnPostprocessAllAssets:所有资源的导入,删除,移动操作都会调用该方法
2.示例,对导入的纹理贴图资源进行一定的自动设置


注意:对图片纹理的设置需要放在OnPreprocessTexture方法中执行
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);    }}
效果如下:
添加脚本前导入图片:


image.png

添加脚本后导入图片:


image.png

显示的日志信息:

image.png
页: [1]
查看完整版本: Unity 编辑器十二 EditorPrefs、Undo、GUIStyle、GUISkin、AssetPostprocessor