• UnityEditor编辑器扩展-表格功能


    目录

    UnityEditor表格关键字

    小哥哥例子一:

    小哥哥例子二:

    最终截图


    因为要做个统计战场有多少,NPC,和建筑物的功能

    突然发现,好像之前一直没做过表格控件(太遥远,找不到了)

    第一时间,上网百度,结果还很快找到了一小哥的资料,及其开源代码

    UnityEditor表格关键字

    Scrope,TreeView

    最终你懂的,Unity官方内部肯定有其控件,只是不公开而已

    小哥说了:也希望unity尽快公开

    但其实unity作为上市公司,目标是和unreal竞争做引擎+编辑器的,人家整个公司还在做“”各种升级“,根本不会在这些程序员的自定义的细微末节(imgui + c# mono层已经是很超前了,极其超前以至于无法超越)上花心思,官方更新的其实想都不用想

    Editor编辑器扩展的关键还是使用了 internal 的组件

    SerializedPropertyTable

    SerializedPropertyTreeView.Column[]

    小哥哥例子一:

    列出Cameras

    m_table = new SerializedPropertyTable("Table", FindObjects, CreateCameraColumn);//查找相机(好例子)
    1. private Camera[] FindObjects()
    2. {
    3. return FindObjectsOfType<Camera>();
    4. }
    1. private SerializedPropertyTreeView.Column[] CreateCameraColumn(out string[] propnames)
    2. {
    3. propnames = new string[3];
    4. var columns = new SerializedPropertyTreeView.Column[3];
    5. columns[0] = new SerializedPropertyTreeView.Column
    6. {
    7. headerContent = new GUIContent("Name"),
    8. headerTextAlignment = TextAlignment.Left,
    9. sortedAscending = true,
    10. sortingArrowAlignment = TextAlignment.Center,
    11. width = 200,
    12. minWidth = 25f,
    13. maxWidth = 400,
    14. autoResize = false,
    15. allowToggleVisibility = true,
    16. propertyName = null,
    17. dependencyIndices = null,
    18. compareDelegate = SerializedPropertyTreeView.DefaultDelegates.s_CompareName,
    19. drawDelegate = SerializedPropertyTreeView.DefaultDelegates.s_DrawName,
    20. filter = new SerializedPropertyFilters.Name()
    21. };
    22. columns[1] = new SerializedPropertyTreeView.Column
    23. {
    24. headerContent = new GUIContent("On"),
    25. headerTextAlignment = TextAlignment.Left,
    26. sortedAscending = true,
    27. sortingArrowAlignment = TextAlignment.Center,
    28. width = 25,
    29. autoResize = false,
    30. allowToggleVisibility = true,
    31. propertyName = "m_Enabled",
    32. dependencyIndices = null,
    33. compareDelegate = SerializedPropertyTreeView.DefaultDelegates.s_CompareCheckbox,
    34. drawDelegate = SerializedPropertyTreeView.DefaultDelegates.s_DrawCheckbox,
    35. };
    36. columns[2] = new SerializedPropertyTreeView.Column
    37. {
    38. headerContent = new GUIContent("Mask"),
    39. headerTextAlignment = TextAlignment.Left,
    40. sortedAscending = true,
    41. sortingArrowAlignment = TextAlignment.Center,
    42. width = 200,
    43. minWidth = 25f,
    44. maxWidth = 400,
    45. autoResize = false,
    46. allowToggleVisibility = true,
    47. propertyName = "m_CullingMask",
    48. dependencyIndices = null,
    49. compareDelegate = SerializedPropertyTreeView.DefaultDelegates.s_CompareInt,
    50. drawDelegate = SerializedPropertyTreeView.DefaultDelegates.s_DrawDefault,
    51. filter = new SerializedPropertyFilters.Name()
    52. };
    53. for (var i = 0; i < columns.Length; i++)
    54. {
    55. var column = columns[i];
    56. propnames[i] = column.propertyName;
    57. }
    58. return columns;
    59. }

    对了,ongui必须写上(整个table结构内核还是基于ongui体系的,若是你之前写过OnGUI()就懂了)

    1. using (new EditorGUILayout.VerticalScope())
    2. {
    3. m_table.OnGUI();
    4. }

    小哥哥例子二:

    扩展自定义数据列表,

    虽然例子一很好,但扩展性没有,几乎不能用,也只是证明了确实能实现数据Binder,甚至是Editor所有的内部绑定,但是Binder对应的字段属性,如Name,m_Enable等等,很难确定正确的名字(必须重复去尝试)

    所以有了例子二,自定数据类外再包一层

    定义自己的类

    上面的方法一,只支持内部的方法(Unity.Object),小哥哥另外封装了一层写法,可支持自定义数据类型

    1. //方法2
    2. public class ExampleDataTable : CommonTable<GameRunTimeItem>
    3. {
    4. public ExampleDataTable(List<GameRunTimeItem> datas,
    5. CommonTableColumn<GameRunTimeItem>[] cs,
    6. FilterMethod<GameRunTimeItem> onfilter,
    7. SelectMethod<GameRunTimeItem> onselect = null)
    8. : base(datas, cs, onfilter, onselect)
    9. {
    10. }
    11. }
    1. public class GameRunTimeItem
    2. {
    3. public string Name;
    4. public int Count;
    5. public int ID;
    6. public int Age;
    7. }

    包一层 Column

    1. void InitTableData(bool forceUpdate = false)
    2. {
    3. if (forceUpdate || m_table == null)
    4. {
    5. //init datas
    6. var datas = new List<GameRunTimeItem>();
    7. //for example,add some test datas
    8. datas.Add(new GameRunTimeItem() { ID = 101, Age = 10, Name = "Lili" });
    9. datas.Add(new GameRunTimeItem() { ID = 203, Age = 15, Name = "JoJo" });
    10. datas.Add(new GameRunTimeItem() { ID = 404, Age = 11, Name = "Kikki" });
    11. datas.Add(new GameRunTimeItem() { ID = 508, Age = 30, Name = "Baby" });
    12. //init columns
    13. var cols = new CommonTableColumn<GameRunTimeItem>[]
    14. {
    15. new CommonTableColumn<GameRunTimeItem>
    16. {
    17. headerContent = new GUIContent("ID"), //header display name
    18. canSort = true, //
    19. Compare = (a,b)=>-a.ID.CompareTo(b.ID), //sort method
    20. DrawCell = (rect,data)=>EditorGUI.LabelField(rect,data.ID.ToString()),
    21. },
    22. new CommonTableColumn<GameRunTimeItem>
    23. {
    24. headerContent = new GUIContent("Name"),//header display name
    25. canSort = true,
    26. Compare = (a,b)=>-a.Name.CompareTo(b.Name),//sort method
    27. DrawCell = (rect,data)=>EditorGUI.LabelField(rect,data.Name),
    28. },
    29. new CommonTableColumn<GameRunTimeItem>
    30. {
    31. headerContent = new GUIContent("Age"),//header display name
    32. DrawCell = (rect,data)=>EditorGUI.LabelField(rect,data.Age.ToString()),
    33. }
    34. };
    35. m_table = new ExampleDataTable(datas, cols, OnTableFilter, OnRowSelect);
    36. }
    37. }
    38. /// <summary>
    39. ///
    40. /// </summary>
    41. /// <param name="datas"></param>
    42. private void OnRowSelect(List<GameRunTimeItem> datas)
    43. {
    44. throw new NotImplementedException();
    45. }
    46. private bool OnTableFilter(GameRunTimeItem data, string std)
    47. {
    48. int number;
    49. if (!int.TryParse(std, out number))
    50. return false;
    51. return data.ID == number;
    52. }
    1. using (new EditorGUILayout.VerticalScope())
    2. {
    3. if (m_table == null)
    4. InitTableData();
    5. if (m_table != null)
    6. m_table.OnGUI();
    7. }

    最终截图

  • 相关阅读:
    三天快速搭建一个属于自己的管理系统,包括前端、后端、部署上线,超级详细的介绍。
    LeetCode 235 二叉搜索树的最近公共祖先 701 二叉搜索树中的插入操作 450删除二叉搜索树中的节点
    【scikit-learn基础】--『分类模型评估』之系数分析
    (二) OGNet 论文笔记
    西北工业大学算法实验机试复习
    处理数据中不必要的部分,并将处理过的数据写入新的文件中
    【C++】 对象模型与内存模型的区别
    parallels desktop 19密钥分享 附PD虚拟机安装教程 支持M/intel
    C++ 数列游戏
    【数据结构取经之路】希尔排序
  • 原文地址:https://blog.csdn.net/avi9111/article/details/125086527