Unity 自定义编辑器,例如“层碰撞矩阵”

Posted

技术标签:

【中文标题】Unity 自定义编辑器,例如“层碰撞矩阵”【英文标题】:Unity Custom Editor Like 'Layer Collision Matrix' 【发布时间】:2012-11-02 00:27:04 【问题描述】:

我试图在编辑器中显示一个二维数组,例如 Unity 中显示的“层碰撞矩阵”:

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

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

谢谢。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

访问被拒绝:( @shieldgenerator7 有趣!我搜索了archive.org 和整个github。看起来 Physics Manager Inspector 的代码不是故意推送的,现在已被删除。不幸的是,我没有为此制作任何副本...【参考方案2】:

您要查找的内容所涉及的代码非常复杂,因此我将依靠您知道我在说什么。 The Unity docs are your friend.

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

    设计三个锚点 (Vector2)。他们每个人都应该代表左​​上角 行标签、列标签和数据字段的坐标。注意 列锚点需要直接位于上方(与 x 值相同) 行锚,因为旋转(下一步)会改变锚。

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

    为您的标签写一个长的GUI.Label(或其中几个)。 将它们锚定在柱锚上。根据上图,您的标签 字符串可以读取类似 "Default\nTransparentFX\nIgnoreRaycast\nWater" 其中 \n 创建 换行符。

    再次旋转,-90° 回到原始矩阵。或者,你 可以在第 3 步之前复制 GUI.matrix,然后将其分配回 保证矩阵复位。由于浮点等不精确,来回旋转可能会有一些误差。

    为行编写标签。与后退两步的方法相同。锚 他们在行锚点。

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

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

【讨论】:

谢谢,看起来不错。我不知道 RotateAroundPivot 的事情(显然没有彻底搜索到找到它。)其余的似乎相对简单(尽管,正如你所说,GUI 有时可能有点烦人。)谢谢!当我成功时,我会发布我的代码,虽然没有时间 atm,所以可能需要一段时间。 很高兴它仍然相关。我注意到这个问题已经两个月了:P 是的,目前我以一种不太人性化的方式解决了它,但没关系,因为只有我必须使用它。 @TheOddler - 你没有发布你的解决方案 - 你能想出一个(或者至少比上面给出的答案更具体的伪代码)吗? @az2tonez 哦,老问题,但我所做的(如果我没记错的话)只是一个超级简单的双 for 循环,计算每个矩阵元素的 x,y 位置。不知道为什么它一开始不起作用,现在看起来很容易。有什么具体不起作用的吗?我将它用于一个旧项目,但代码应该仍然在我的 git repo 中的某个地方,所以如果你愿意,我可以查找它。

以上是关于Unity 自定义编辑器,例如“层碰撞矩阵”的主要内容,如果未能解决你的问题,请参考以下文章

Unity 自定义编辑器窗口输入控件,用于反射确定的类型

关于Unity3D自定义编辑器的学习

如何自定义unity的inspector面板

关于Unity实现自定义多边形图片效果

Unity 自定义编辑器窗口 画线

Unity 自定义编辑器 Raycast 在实例化对象后无法正常工作