类似于“层碰撞矩阵”的Unity自定义编辑器

12

我想在编辑器中像Unity的“图层碰撞矩阵”一样显示一个二维数组:

enter image description here

不过,我需要的是整数,而且是完整的网格(而非三角形状)。但是,我似乎无法弄清楚如何实现这一点... 我可以得到一个自定义的编辑器,但制作网格失败了。那么,有没有办法可以查看Physics Manager编辑器的代码(图层碰撞矩阵就在其中),或者也许有人知道一个好方法来做到这一点?

注:首选语言为C#,但任何语言都可以。

谢谢。

3个回答

7
你所寻找的代码涉及到的内容相当复杂,所以我需要依靠你了解我在这里说的是什么。Unity文档是你的朋友。
  1. 创建一个GUIArea,用于放置你的特殊编辑工具。在里面,放置一个函数调用,然后调用其他渲染函数。我猜你会想要进行一些封装。将gui封装在另一个函数中,可以让你复制其功能(在你的抽象范围内),更轻松地在屏幕上移动东西。

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

  3. 使用GUIUtility.RotateAroundPivot()以列锚点为中心点将GUI变换矩阵顺时针旋转90°。

  4. 为标签编写长的GUI.Label(或几个)。将它们固定在列锚点处。根据上图,您的标签字符串可能会读取类似于“默认\n透明FX\n忽略射线\n水”,其中\n创建一个新行。

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

  6. 为行编写标签。与两步相同的方法。将它们固定在行锚点处。

  7. 这是更难的部分。遍历你的数据字段,为每个元素创建一个小的EditorGUI.IntField()StringField()甚至是ObjectField()。每个元素都需要自己的锚点,然后将其与数据字段锚点相加。如果你的数据字段是一个正方形的2D数组,那么导出锚点将很容易——尽管你的数组中也会有空元素(如果你想要上述精确功能)。如果你想节省内存,你将不得不使用一些巧妙的数学方法将元素索引转换为坐标。我不确定我会如何做。

希望我没有忘记任何东西。Unity的GUI很难用。如果您有疑问,请留言,我会尽力帮助您。

1
谢谢,看起来不错。我不知道RotateAroundPivot这个东西(显然没有搜索得够彻底)。其余部分似乎相对简单(尽管如你所说,GUI有时可能会有点烦人)。谢谢!等我完成后我会发布我的代码,但现在没时间,可能要等一段时间。 - The Oddler
很高兴它仍然相关。我注意到这个问题已经两个月了 :P - cjcurrie
1
是的,目前我用了一种不太用户友好的方法解决了它,但这没关系,因为只有我需要使用它。 - The Oddler
@TheOddler - 你没有发布你的解决方案 - 你能否想出一个解决方案(或者至少比上面给出的答案更具体的伪代码)? - az2tonez
@az2tonez 噢,这是一个老问题了,但我记得我所做的(如果我没记错的话)只是一个超级简单的双重循环,计算每个矩阵元素的x、y位置。不确定为什么一开始它没有起作用,现在看起来好像很容易。有什么具体的问题吗?我曾经在一个旧项目中使用过这个,但代码应该仍然在我的git存储库中的某个地方,如果你想的话我可以查找一下。 - The Oddler
感谢@TheOddler!最终我绕过了整个问题 - 我只是需要PhysicsSettings编辑器中的信息,所以我在我的检查器中有一个按钮来同步所有设置。 - az2tonez

0

访问被拒绝 :( - shieldgenerator7
@shieldgenerator7 很有趣!我搜索了archive.org和整个github。看起来Physics Manager Inspector的代码并没有被故意推送,现在已经被删除了。不幸的是,我没有为此做任何备份... - PiotrK

0

目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接