Scene视图自定义菜单
效果:
在Scene窗口右键,在鼠标位置生成菜单,如下:
点击菜单Test1
点击菜单XFKT/Test2
代码:
//放到Editer文件夹中
using UnityEditor;
using UnityEngine;
public class SceneMenu : MonoBehaviour
{
[InitializeOnLoadMethod]
static void InitializeOnLoad()
{
SceneView.duringSceneGui += (sceneView) =>
{
if (Event.current != null && Event.current.button == 1 && Event.current.type == EventType.MouseUp)
{
Rect position = new Rect(Event.current.mousePosition.x, Event.current.mousePosition.y - 100, 100, 100);
GUIContent[] contents = new GUIContent[] { new GUIContent("Test1"), new GUIContent("XFKT/Test2") };
EditorUtility.DisplayCustomMenu(position, contents, -1, (data, opt, select) =>
{
Debug.LogFormat("data:{0},opt:{1},select:{2},value:{3}", data, opt, select, opt[select]);
}, null);
//因为需要点击右键,呼出菜单
//点击右键,此时Scene窗口会进入游览状态
//为了保持变换工具不变。
//例如,右键前后都是 变换工具-移动物体
Event.current.Use();
}
};
}
}
Scene窗口的Gizmos
打开Scene窗口的Gizmos按钮。(可能是默认开启)
物体被选中时,画线、球
效果:
代码:
不需要放到Editer文件夹中,建议放到Scripts文件夹中。
需要挂载到物体。
using UnityEngine;
public class SceneGizmos : MonoBehaviour
{
public Color color;//如果不显示,则调整RGBA中的A
private void OnDrawGizmosSelected()
{
Gizmos.color = color;
Gizmos.DrawLine(transform.position, transform.position + Vector3.up * 2);
Gizmos.DrawSphere(transform.position, 1);
}
}
一直显示,线、球、图标
效果:
代码:
using UnityEngine;
public class SceneGizmos : MonoBehaviour
{
private void OnDrawGizmos()//一直显示
{
Gizmos.DrawLine(transform.position, transform.position + Vector3.up * 2);
Gizmos.DrawSphere(transform.position, 1);
Gizmos.DrawIcon(transform.position, "Assets/Textures 1/Btn.png");
}
}
在Scene窗口中添加UI
物体被选中时,添加按钮、标签
效果:
代码:
using UnityEditor;
using UnityEngine;
//选中的物体上有SceneGizmos组件,才执行。其他组件也可以
[CustomEditor(typeof(SceneGizmos))]
public class SceneGUI : Editor
{
private void OnSceneGUI()
{
Handles.BeginGUI();
//绘制按钮
//按钮默认位置在左上角
if (GUILayout.Button("test1", GUILayout.Width(100)))//如果点击按钮
{
Debug.Log(target.name);
}
//绘制标签
GUILayout.Label(target.name);
Handles.EndGUI();
}
}
一直显示,按钮、标签
效果:
代码:
using UnityEditor;
using UnityEngine;
public class SceneGUI : Editor
{
[InitializeOnLoadMethod]
static void InitializeOnLoad()
{
SceneView.duringSceneGui += (sceneView) =>
{
Handles.BeginGUI();
if (GUILayout.Button("test2", GUILayout.Width(100)))
{
Debug.Log("test2");
}
GUILayout.Label("弦风课堂");
Handles.EndGUI();
};
}
}