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 自定义编辑器,例如“层碰撞矩阵”的主要内容,如果未能解决你的问题,请参考以下文章