Handles
Namespace: UnityEditorCustom 3D GUI controls and drawing in the scene view.
OnSceneGUI
/ function. You can use HandleUtility.GUIPointToWorldRay and HandleUtility.WorldToGUIPoint to convert coordinates between 2D GUI and 3D world coordinates.
A UnityGUI event.
using UnityEngine;
using System.Collections;
public class SceneTag : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
public Vector3 vectorPoint = Vector3.zero;
public Vector3 vectorPoint2 = Vector3.zero;
public float shieldArea = 5;
public Quaternion rot = Quaternion.identity;
}
using UnityEngine;
using UnityEditor;
using System.Collections;
using System;
using System.Text;
[CustomEditor(typeof(SceneTag))]
public class SceneEditor : Editor {
void OnEnable()
{
}
void OnDisable()
{
}
void OnDestroy()
{
}
void OnInspectorGUI()
{
}
void OnSceneGUI()
{
Test_Handles();
Test_Event();
}
private static void Test_Event()
{
Vector2 mousePosition = Event.current.mousePosition;
StringBuilder sb = new StringBuilder();
sb.AppendFormat("({0},{1})"
, mousePosition.x
, mousePosition.y);
//Debug.Log(sb.ToString());
}
private void Test_Handles()
{
SceneTag scene = target as SceneTag;
Test_Color(scene);
//Test_Button(scene);
Test_ArrowCap(scene);
Test_CircleCap(scene);
Test_ChangeValue(scene);
Test_DrawAAPolyLine(scene);
Test_DrawSolidArc(scene);
Test_ScaleValueHandle(scene);
Test_FreeRotateHandle(scene);
Test_FreeMoveHandle(scene);
Test_BeginGUI(scene);
if (GUI.changed)
EditorUtility.SetDirty(target);
}
private static void Test_FreeMoveHandle(SceneTag scene)
{
scene.vectorPoint = Handles.FreeMoveHandle(scene.vectorPoint,
Quaternion.identity,
2.0f,
Vector3.zero,
Handles.ArrowCap);
}
private static void Test_FreeRotateHandle(SceneTag scene)
{
scene.transform.rotation = Handles.FreeRotateHandle(scene.transform.rotation, scene.transform.position, 0.5f);
}
private static void Test_ScaleValueHandle(SceneTag scene)
{
scene.shieldArea
= Handles.ScaleValueHandle(scene.shieldArea,
scene.transform.position + scene.transform.forward * scene.shieldArea,
scene.transform.rotation,
1,
Handles.ConeCap,
1);
}
private static void Test_DrawSolidArc(SceneTag scene)
{
Handles.color = new Color(1, 1, 1, 0.2f);
Handles.DrawSolidArc(scene.transform.position,
scene.transform.up,
-scene.transform.right,
270,
scene.shieldArea);
Handles.color = Color.white;
scene.shieldArea =
Handles.ScaleValueHandle(scene.shieldArea,
scene.transform.position + scene.transform.forward * scene.shieldArea,
scene.transform.rotation,
1,
Handles.ConeCap,
1);
}
private static void Test_DrawAAPolyLine(SceneTag scene)
{
Vector3[] positions = new Vector3[]
{
new Vector3(2,0,0),
new Vector3(2,1,0),
new Vector3(2,1,1),
new Vector3(1,2,1),
new Vector3(1,2,2),
};
for (int i = 0; i < positions.Length; ++i)
{
positions[i] += scene.transform.position;
}
Handles.DrawAAPolyLine(positions);
}
private static void Test_ChangeValue(SceneTag scene)
{
scene.rot =
Handles.Disc(scene.rot,
scene.transform.position,
new Vector3(1, 1, 0),
5,
false,
1);
scene.vectorPoint = Handles.DoPositionHandle(scene.vectorPoint, Quaternion.identity);
scene.vectorPoint2 = Handles.DoPositionHandle(scene.vectorPoint2, Quaternion.identity);
}
private static void Test_CircleCap(SceneTag scene)
{
float circleSize = 1;
Handles.color = Color.red;
Handles.CircleCap(0,
scene.transform.position + new Vector3(5, 0, 0),
scene.transform.rotation,
circleSize);
Handles.color = Color.green;
Handles.CircleCap(0,
scene.transform.position + new Vector3(0, 5, 0),
scene.transform.rotation,
circleSize);
Handles.color = Color.blue;
Handles.CircleCap(0,
scene.transform.position + new Vector3(0, 0, 5),
scene.transform.rotation,
circleSize);
Handles.color = Color.red;
Vector3 newpos = scene.transform.position + new Vector3(5, 0, 0);
circleSize = HandleUtility.GetHandleSize(newpos);
Handles.CircleCap(0,
newpos,
scene.transform.rotation,
circleSize);
Handles.color = Color.green;
newpos = scene.transform.position + new Vector3(0, 5, 0);
circleSize = HandleUtility.GetHandleSize(newpos);
Handles.CircleCap(0,
newpos,
scene.transform.rotation,
circleSize);
Handles.color = Color.blue;
newpos = scene.transform.position + new Vector3(0, 0, 5);
circleSize = HandleUtility.GetHandleSize(newpos);
Handles.CircleCap(0,
newpos,
scene.transform.rotation,
circleSize);
}
//note by kun 2014.2.18
// 这玩意有啥用?巨难操作!;
// 3D按钮还会因为视角问题呈现不一样的大小。;
// 而且按钮的当前状态也更新不及时,逗么?;
private static void Test_Button(SceneTag scene)
{
Handles.Button(scene.transform.position + new Vector3(0, 2, 0),
Quaternion.identity,
3,
3,
Handles.RectangleCap);
}
private static void Test_BeginGUI(SceneTag scene)
{
Handles.color = Color.blue;
Handles.Label(scene.transform.position + Vector3.up * 2,
scene.transform.position.ToString() + "\nShieldArea: " +
scene.shieldArea.ToString());
Handles.color = Color.red;
Handles.DrawWireArc(scene.transform.position,
scene.transform.up,
-scene.transform.right,
180,
scene.shieldArea);
scene.shieldArea =
Handles.ScaleValueHandle(scene.shieldArea,
scene.transform.position + scene.transform.forward * scene.shieldArea,
scene.transform.rotation,
1,
Handles.ConeCap,
1);
//comment by kun 2014.2.18
// GUI相关的绘制需要在Handles的绘制之后,否则会被覆盖掉;
// 使用Handles.BeginGUI会导致无法旋转摄像机,原因不详;
GUILayout.BeginArea(new Rect(Screen.width - 100, Screen.height - 80, 90, 50));
//Handles.BeginGUI(new Rect(Screen.width - 100, Screen.height - 80, 90, 50));
try
{
float a = float.Parse(GUILayout.TextField(scene.shieldArea.ToString()));
scene.shieldArea = a;
}
catch (System.Exception ex)
{
}
if (GUILayout.Button("Reset Area"))
scene.shieldArea = 5;
//Handles.EndGUI();
GUILayout.EndArea();
}
private static void Test_ArrowCap(SceneTag scene)
{
float arrowSize = 1;
Handles.color = Color.red;
Handles.ArrowCap(0,
scene.transform.position + new Vector3(5, 0, 0),
scene.transform.rotation,
arrowSize);
Handles.color = Color.green;
Handles.ArrowCap(0,
scene.transform.position + new Vector3(0, 5, 0),
scene.transform.rotation,
arrowSize);
Handles.color = Color.blue;
Handles.ArrowCap(0,
scene.transform.position + new Vector3(0, 0, 5),
scene.transform.rotation,
arrowSize);
}
private void Test_Color(SceneTag scene)
{
Handles.color = Color.magenta;
scene.vectorPoint = Handles.Slider(scene.vectorPoint,
Vector3.zero - scene.transform.position);
}
}