📅  最后修改于: 2023-12-03 15:24:53.381000             🧑  作者: Mango
在 Unity3D 中,Gizmos 是带有视觉提示的辅助工具,可以帮助我们更好地理解场景中的空间关系。本文将介绍如何统一绘制 Gizmos,以便在整个项目中保持一致的外观和行为。
我们可以创建一个 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。
要在 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 添加一个菜单项,以便在场景视图中轻松添加和删除它们。下面是如何添加菜单项的示例代码:
[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 添加菜单项可以在场景视图中轻松添加和删除它们。