我试图在编辑器中显示一个二维数组,如 Unity 中显示的“层碰撞矩阵”:
虽然我需要整数和一个完整的网格(不是三角形)而不是复选框。但我似乎无法弄清楚如何做到这一点......我可以获得一个自定义编辑器,尽管使网格失败。那么,有什么方法可以让我看到物理管理器编辑器的代码(层碰撞矩阵在里面),或者有人知道这样做的好方法吗?
注意:首选语言是 c#,尽管任何语言都可以。
谢谢。
您要查找的内容所涉及的代码非常复杂,因此我将依靠您知道我在说什么。Unity 文档是您的朋友。
创建GUIArea
您的特殊编辑器工具所在的位置。在其中放置一个函数调用,然后调用其他渲染函数。我怀疑你会想在这里做一些封装。将 gui 封装在另一个函数中将允许您复制其功能(在抽象的限制内)并更轻松地在屏幕上移动内容。
设计三个锚点 ( Vector2
)。它们应该分别代表行标签、列标签和数据字段的左上角坐标。请注意,列锚需要在行锚的正上方(与行锚相同的 x 值),因为旋转(下一步)将改变锚。
用于GUIUtility.RotateAroundPivot()
将 GUI 变换矩阵围绕列锚点旋转 90°。
为您的标签写一个长的GUI.Label
(或几个)。将它们锚定在柱锚上。根据上图,您的标签字符串可能会显示为“Default\nTransparentFX\nIgnoreRaycast\nWater”之类的内容,其中 \n 会创建一个换行符。
再次旋转,-90° 回到原始矩阵。或者,您可以在第 3 步之前复制GUI.matrix
,然后将其分配回去以保证矩阵重置。由于浮点数和其他不精确性,来回旋转可能会产生一些误差。
为行写标签。与后退两步的方法相同。将它们锚定在行锚上。
这是较难的部分。遍历您的数据字段,为数据中的每个元素创建一个小元素,甚至
EditorGUI.IntField()
创建一个小元素。每个元素都需要自己的锚点,然后将其与数据字段锚点相加。如果您的数据字段是一个方形 2D 数组,则派生锚点将很容易——尽管您的数组中也会有空元素(如果您想要上面描述的确切功能)。如果要节省内存,则必须使用一些棘手的数学将元素索引转换为坐标。我不确定我会怎么做。StringField()
ObjectField()
希望我没有忘记任何事情。Unity 的 GUI 是一个 b----。评论,我会尽力帮助你。
因为我刚从 Google 来到这里......这里有 Unity 编辑器的源代码:https ://github.com/Unity-Technologies/UnityCsReference/blob/master/Editor/Mono/Inspector/PhysicsManagerInspector.cs
令人惊讶的是,它使用GUILayout.BeginScrollView
的是计算高度,因此它与EditorGUILayout
样式兼容并GUI.matrix
用于文本旋转。我不会去思考整个代码(第 40 到 95 行),但我建议检查一下。