UIElement编辑器扩展 组件 Inspector

UIElement编辑器扩展 组件 Inspector

https://docs.unity.cn/cn/2021.3/Manual/UIE-create-a-binding-uxml-inspector.html

简单开始

声明序列化VisualTreeAsset

SerializeField\] VisualTreeAsset visualTree; 声明完,直接在脚本的Inspector面板,把你这个界面的UXML拖进去就可以了,非常方便 基础的属性,在UIBuilder里拖好需要的组件,bingdingPath填好属性名即可 ```csharp //测试组件 public class TestComp : MonoBehaviour { public int TestInt; public GameObject TestGO; } ``` ```csharp //测试组件的编辑器扩展 using UnityEditor; using UnityEngine; using UnityEngine.UIElements; [CustomEditor(typeof(TestComp))] public class TestCompEditor : Editor { [SerializeField] VisualTreeAsset m_InspectorXML; public override VisualElement CreateInspectorGUI() { var root = m_InspectorXML.CloneTree(); return root; } } ``` ### 封装的数据对象 ```csharp [Serializable] public class TestItem { public string name; public GameObject gameObject; } public class TestComp : MonoBehaviour { public int TestInt; public GameObject TestGO; public TestItem Item; } ``` 对TestItem单独创建一个UXML,根据属性在UIBuilder拖好需要的组件 在TestCompEditor.cs,增加TestItem.uxml这个文件的声明 增加一点CreateInspectorGUI代码 ```csharp //测试组件的编辑器扩展 using UnityEditor; using UnityEngine; using UnityEngine.UIElements; [CustomEditor(typeof(TestComp))] public class TestCompEditor : Editor { [SerializeField] VisualTreeAsset m_InspectorXML; //增加的TestItem UXML [SerializeField] VisualTreeAsset m_ItemAsset; public override VisualElement CreateInspectorGUI() { var root = visualTree.CloneTree(); var item = m_PropertyAsset.CloneTree(); //指定TestComp的属性名 item.bindingPath = "Item"; //加入即可 root.Add(item); return root; } } ``` ### List+数据对象 ```csharp [Serializable] public class TestItem { public string name; public GameObject gameObject; } public class TestComp : MonoBehaviour { public int TestInt; public GameObject TestGO; public TestItem Item; public List ItemList; } ``` TestComp.uxml添加一个ListView 因为这个List内的数据用的还是上个例子的TestItem, 就继续用TestItem.uxml了 (ListView非常方便,reorderable之类的样式,直接在UIBuilder就能用了) ```csharp //测试组件的编辑器扩展 using UnityEditor; using UnityEngine; using UnityEngine.UIElements; [CustomEditor(typeof(TestComp))] public class TestCompEditor : Editor { [SerializeField] VisualTreeAsset m_InspectorXML; //增加的TestItem UXML [SerializeField] VisualTreeAsset m_ItemAsset; public override VisualElement CreateInspectorGUI() { var root = visualTree.CloneTree(); var item = m_ItemAsset.CloneTree(); item.bindingPath = "Item"; root.Add(item); //找到TestComp.uxml添加的ListView,多个List可以用name var listView = root.Q(); //makeItem赋值方法 listView.makeItem = m_ItemAsset.CloneTree; return root; } } ```

相关推荐
雨泽‎10 小时前
Unity在URP中开启后处理导致RenderTexture存在背景
unity·游戏引擎·图形渲染
冒泡P18 小时前
【Unity】TextMeshPro富文本中使用精灵图集
ui·unity·c#·游戏引擎
世洋Blog18 小时前
开发思想-(数据驱动+组合模式)VS 继承
unity·组合模式·数据驱动
B0URNE20 小时前
【Unity基础详解】(9)Unity核心:UI系统
ui·unity·游戏引擎
jtymyxmz1 天前
《Unity Shader》7.3 渐变纹理
unity·游戏引擎
ThreePointsHeat2 天前
Unity 关于打包WebGL + jslib录制RenderTexture画面
unity·c#·webgl
胡童嘉2 天前
长沙烈焰鸟网络科技有限公司实习day13日记
功能测试·学习·职场和发展·游戏引擎·cocos2d
y***54882 天前
C++在游戏引擎中的开发
开发语言·c++·游戏引擎
BuHuaX2 天前
Unity_AssetBundle相关
unity·c#·游戏引擎·游戏策划
神码编程2 天前
【Unity】 HTFramework框架(六十八)StringEditor字符串复杂编辑器
unity·编辑器·游戏引擎·htframework