手动编辑Unity3D碰撞器坐标?

10

我正在尝试创建一个2D游戏,需要使用具有完美对称性的2D多边形碰撞器,因此我想手动/数值设置坐标,而不是使用鼠标。

怎么做呢?

我想游戏可以在启动时调整坐标,但如果可能的话,我更希望在“设计时间”就设置正确。另外,如果我要在启动时以编程方式进行操作,我会感激提供如何做以及相应链接的教程。

2个回答

13
您可以使用PolygonCollider2D.points在脚本中设置碰撞器顶点,或者您可以在检查器中启用调试模式并手动输入它们,但这仅适用于Unity 4:

enter image description here

对于Unity 5,您可以使用以下解决方法。将下面的脚本放置在Editor文件夹中。

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(PolygonCollider2D))]
public class PolygonCollider2DEditor : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        var collider = (PolygonCollider2D)target;
        var points = collider.points;
        for (int i = 0; i < points.Length; i++)
        {
            points[i] = EditorGUILayout.Vector2Field(i.ToString(), points[i]);
        }
        collider.points = points;
        EditorUtility.SetDirty(target);
    }
}

呃...尝试了调试模式,但仍然无法访问这些点。我正在使用Unity 5.0.1f1。是版本差异还是我需要做比设置Debug模式更多的事情? - Kjell Rilbe
我的截图来自4.6.4f1版本,看起来他们在Unity 5中禁用了这个功能。已经更正了答案。 - Olivia
不错!似乎删除了标准图形编辑模式的按钮,有没有办法两者都有? - Kjell Rilbe
1
为了实现这个,你需要继承自内部的UnityEditor.PolygonCollider2DEditor类,但这是不可能的。如果你真的非常想要它,你可以反编译它并保存为自己的文件,但是接下来你还需要Collider2DEditorBase,它继承自ColliderEditorBase,而后者又需要另一个类...你懂的。另一个可能性是从Unity获得源代码许可证。 - Olivia
我明白了。这样就可以了。非常感谢! - Kjell Rilbe
这些坐标空间是什么?我猜测它是从-1到1,但它如何映射到实际的纹理像素? - jjxtra

2
我通过创建一个其他脚本来添加PolygonCollider2D,以解决这个问题。这个额外的脚本用于编辑多边形点。因此,这是一个用于编辑其他内容并保留“编辑碰撞体”按钮的脚本。
打印:http://i.stack.imgur.com/UN2s8.jpg
[RequireComponent(typeof(PolygonCollider2D))]
public class PolygonCollider2DManualPoins : MonoBehaviour { }

[UnityEditor.CustomEditor(typeof(PolygonCollider2DManualPoins))]
public class PolygonCollider2DManualPoinsEditor : UnityEditor.Editor {
    public override void OnInspectorGUI() {
        base.OnInspectorGUI();
        var collider = ((PolygonCollider2DManualPoins)target).GetComponent<PolygonCollider2D>();
        var points = collider.points;
        for (int i = 0; i < points.Length; i++){
            points[i] = UnityEditor.EditorGUILayout.Vector2Field(i.ToString(), points[i]);
        }
        collider.points = points;
        UnityEditor.EditorUtility.SetDirty(collider);
    }
}

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