11

我试图在编辑器中显示一个二维数组,如 Unity 中显示的“层碰撞矩阵”: 在此处输入图像描述

虽然我需要整数和一个完整的网格(不是三角形)而不是复选框。但我似乎无法弄清楚如何做到这一点......我可以获得一个自定义编辑器,尽管使网格失败。那么,有什么方法可以让我看到物理管理器编辑器的代码(层碰撞矩阵在里面),或者有人知道这样做的好方法吗?

注意:首选语言是 c#,尽管任何语言都可以。

谢谢。

4

2 回答 2

7

您要查找的内容所涉及的代码非常复杂,因此我将依靠您知道我在说什么。Unity 文档是您的朋友。

  1. 创建GUIArea您的特殊编辑器工具所在的位置。在其中放置一个函数调用,然后调用其他渲染函数。我怀疑你会想在这里做一些封装。将 gui 封装在另一个函数中将允许您复制其功能(在抽象的限制内)并更轻松地在屏幕上移动内容。

  2. 设计三个锚点 ( Vector2)。它们应该分别代表行标签、列标签和数据字段的左上角坐标。请注意,列锚需要在行锚的正上方(与行锚相同的 x 值),因为旋转(下一步)将改变锚。

  3. 用于GUIUtility.RotateAroundPivot()将 GUI 变换矩阵围绕列锚点旋转 90°。

  4. 为您的标签写一个长的GUI.Label(或几个)。将它们锚定在柱锚上。根据上图,您的标签字符串可能会显示为“Default\nTransparentFX\nIgnoreRaycast\nWater”之类的内容,其中 \n 会创建一个换行符。

  5. 再次旋转,-90° 回到原始矩阵。或者,您可以在第 3 步之前复制GUI.matrix,然后将其分配回去以保证矩阵重置。由于浮点数和其他不精确性,来回旋转可能会产生一些误差。

  6. 为行写标签。与后退两步的方法相同。将它们锚定在行锚上。

  7. 这是较难的部分。遍历您的数据字段,为数据中的每个元素创建一个小元素,甚至 EditorGUI.IntField()创建一个小元素。每个元素都需要自己的锚点,然后将其与数据字段锚点相加。如果您的数据字段是一个方形 2D 数组,则派生锚点将很容易——尽管您的数组中也会有空元素(如果您想要上面描述的确切功能)。如果要节省内存,则必须使用一些棘手的数学将元素索引转换为坐标。我不确定我会怎么做。StringField()ObjectField()

希望我没有忘记任何事情。Unity 的 GUI 是一个 b----。评论,我会尽力帮助你。

于 2013-01-08T22:44:52.687 回答
0

因为我刚从 Google 来到这里......这里有 Unity 编辑器的源代码:https ://github.com/Unity-Technologies/UnityCsReference/blob/master/Editor/Mono/Inspector/PhysicsManagerInspector.cs

令人惊讶的是,它使用GUILayout.BeginScrollView的是计算高度,因此它与EditorGUILayout样式兼容并GUI.matrix用于文本旋转。我不会去思考整个代码(第 40 到 95 行),但我建议检查一下。

于 2021-10-03T14:21:09.887 回答