我想在编辑器中像Unity的“图层碰撞矩阵”一样显示一个二维数组:
不过,我需要的是整数,而且是完整的网格(而非三角形状)。但是,我似乎无法弄清楚如何实现这一点... 我可以得到一个自定义的编辑器,但制作网格失败了。那么,有没有办法可以查看Physics Manager编辑器的代码(图层碰撞矩阵就在其中),或者也许有人知道一个好方法来做到这一点?
注:首选语言为C#,但任何语言都可以。
谢谢。
我想在编辑器中像Unity的“图层碰撞矩阵”一样显示一个二维数组:
不过,我需要的是整数,而且是完整的网格(而非三角形状)。但是,我似乎无法弄清楚如何实现这一点... 我可以得到一个自定义的编辑器,但制作网格失败了。那么,有没有办法可以查看Physics Manager编辑器的代码(图层碰撞矩阵就在其中),或者也许有人知道一个好方法来做到这一点?
注:首选语言为C#,但任何语言都可以。
谢谢。
创建一个GUIArea
,用于放置你的特殊编辑工具。在里面,放置一个函数调用,然后调用其他渲染函数。我猜你会想要进行一些封装。将gui封装在另一个函数中,可以让你复制其功能(在你的抽象范围内),更轻松地在屏幕上移动东西。
设计三个锚点(Vector2
)。它们应该分别表示行标签、列标签和数据字段的左上角坐标。请注意,列锚点需要直接位于行锚点的上方(x值相同),因为旋转(下一步)将转换锚点。
使用GUIUtility.RotateAroundPivot()
以列锚点为中心点将GUI变换矩阵顺时针旋转90°。
为标签编写长的GUI.Label
(或几个)。将它们固定在列锚点处。根据上图,您的标签字符串可能会读取类似于“默认\n透明FX\n忽略射线\n水”,其中\n创建一个新行。
再次旋转,-90°回到原始矩阵。或者,您可以在第3步之前复制GUI.matrix
,然后将其重新分配回来以进行保证矩阵重置。来回旋转可能会因浮点和其他不精确性而产生一些误差。
为行编写标签。与两步相同的方法。将它们固定在行锚点处。
这是更难的部分。遍历你的数据字段,为每个元素创建一个小的EditorGUI.IntField()
或StringField()
甚至是ObjectField()
。每个元素都需要自己的锚点,然后将其与数据字段锚点相加。如果你的数据字段是一个正方形的2D数组,那么导出锚点将很容易——尽管你的数组中也会有空元素(如果你想要上述精确功能)。如果你想节省内存,你将不得不使用一些巧妙的数学方法将元素索引转换为坐标。我不确定我会如何做。
我刚从Google来到这里...这里有Unity编辑器的源代码可用:https://github.com/Unity-Technologies/UnityCsReference/blob/master/Editor/Mono/Inspector/PhysicsManagerInspector.cs
令人惊讶的是,它使用了GUILayout.BeginScrollView
计算高度,因此与EditorGUILayout
样式兼容,并利用GUI.matrix
进行文本旋转。我不会浏览整个代码(第40至95行),但我建议您查看一下。