📜  如何统一绘制 Gizmos - C# (1)

📅  最后修改于: 2023-12-03 15:24:53.381000             🧑  作者: Mango

如何统一绘制 Gizmos - C#

在 Unity3D 中,Gizmos 是带有视觉提示的辅助工具,可以帮助我们更好地理解场景中的空间关系。本文将介绍如何统一绘制 Gizmos,以便在整个项目中保持一致的外观和行为。

定义 Gizmo 类

我们可以创建一个 Gizmo 类来封装我们需要绘制的 Gizmos。下面是一个示例 Gizmo 类:

public class MyGizmo
{
    public Vector3 position;
    public Color color;
    public float size;

    public void DrawGizmo()
    {
        Gizmos.color = color;
        Gizmos.DrawWireSphere(position, size);
    }
}

该类使用公共字段存储要绘制的 Gizmo 位置、颜色和大小,并定义了一个 DrawGizmo 方法来绘制 Gizmo。

在 Editor 中绘制 Gizmos

要在 Unity3D 中绘制 Gizmos,我们需要在自己的 Editor 脚本中实现 OnDrawGizmos 和 OnDrawGizmosSelected 方法。OnDrawGizmos 方法在场景视图中绘制 Gizmos,而 OnDrawGizmosSelected 方法只有在对象被选中时才会绘制 Gizmos。

下面是一个示例 Editor 脚本,它使用 MyGizmo 类来绘制 Gizmos:

[CustomEditor(typeof(MyComponent))]
public class MyComponentEditor : Editor
{
    private MyComponent myComponent;

    private void OnEnable()
    {
        myComponent = target as MyComponent;
    }

    private void OnDisable()
    {
        myComponent = null;
    }

    private void OnSceneGUI()
    {
        if (myComponent == null)
            return;

        foreach (MyGizmo gizmo in myComponent.gizmos)
        {
            gizmo.DrawGizmo();
        }
    }
}

该脚本使用 CustomEditor 属性来创建一个自定义的编辑器窗口,然后在 OnSceneGUI 方法中使用 MyGizmo 类来绘制 Gizmos。

为 Gizmos 添加菜单项

为了方便起见,我们可以为自己的 Gizmos 添加一个菜单项,以便在场景视图中轻松添加和删除它们。下面是如何添加菜单项的示例代码:

[MenuItem("GameObject/Add My Gizmo")]
public static void AddMyGizmo()
{
    GameObject selectedObject = Selection.activeGameObject;

    MyComponent myComponent = selectedObject.GetComponent<MyComponent>();

    if (myComponent == null)
    {
        myComponent = selectedObject.AddComponent<MyComponent>();
    }

    MyGizmo myGizmo = new MyGizmo();
    myGizmo.position = selectedObject.transform.position;
    myGizmo.color = Color.red;
    myGizmo.size = 1;

    myComponent.gizmos.Add(myGizmo);
}

该代码在 GameObject 菜单下添加一个 Add My Gizmo 菜单项,并在单击后在当前选择的 GameObject 上添加一个 MyComponent 组件和一个 MyGizmo 对象。

小结

通过创建一个 Gizmo 类和一个自定义的 Editor 脚本,我们可以统一绘制 Gizmos,并在整个项目中保持一致的外观和行为。同时,为 Gizmos 添加菜单项可以在场景视图中轻松添加和删除它们。