- Home /
How does Handles.Slider2D work correctly?
I'm experimenting with extending the editor and stumbled accross the Slider2D handle. As all other handles work pretty much out of the box, because they are acting in the 3D space, the Slider2D gives me some headaches. Maybe someone can team up with me to build a simple exmaple here? I create a simple MonoBehavior class, which draws a border around its 1,1,0 area and placed a smaller box inside. Now I want to be able to drag the smaller box around within the box. This is my code so far.
The Panel class:
using UnityEngine; using System.Collections;
public class CUIPanel : MonoBehaviour {
public Vector2 ui2dBox=new Vector2(0,0);
void Start () {
}
void Update () {
}
void OnDrawGizmos() {
Gizmos.DrawLine(transform.TransformPoint(0,0,0),transform.position+transform.TransformDirection(1,0,0));
Gizmos.DrawLine(transform.TransformPoint(1,0,0),transform.position+transform.TransformDirection(1,1,0));
Gizmos.DrawLine(transform.TransformPoint(1,1,0),transform.position+transform.TransformDirection(0,1,0));
Gizmos.DrawLine(transform.TransformPoint(0,1,0),transform.position+transform.TransformDirection(0,0,0));
Gizmos.DrawLine(transform.TransformPoint(ui2dBox.x,ui2dBox.y,0),transform.TransformPoint(ui2dBox.x+0.1f,ui2dBox.y,0));
Gizmos.DrawLine(transform.TransformPoint(ui2dBox.x+0.1f,ui2dBox.y,0),transform.TransformPoint(ui2dBox.x+0.1f,ui2dBox.y+0.1f,0));
Gizmos.DrawLine(transform.TransformPoint(ui2dBox.x+0.1f,ui2dBox.y+0.1f,0),transform.TransformPoint(ui2dBox.x,ui2dBox.y+0.1f,0));
Gizmos.DrawLine(transform.TransformPoint(ui2dBox.x,ui2dBox.y+0.1f,0),transform.TransformPoint(ui2dBox.x,ui2dBox.y,0));
}
}
The editor class:
using UnityEditor; using UnityEngine; using System.Collections;
[CustomEditor(typeof(CUIPanel))] public class CUIPanelEditor : Editor { private Vector3 prevPos=new Vector3(-999.9f,-999.9f,-999.9f); void Start () { } public void OnSceneGUI() { CUIPanel cuiPanel=(CUIPanel) target; Handles.color=Color.red; Vector3 xHandle=Handles.Slider2D( cuiPanel.transform.TransformPoint(cuiPanel.ui2dBox.x,cuiPanel.ui2dBox.y,0), cuiPanel.transform.TransformDirection(Vector3.right), cuiPanel.transform.TransformDirection(Vector3.right), cuiPanel.transform.TransformDirection(Vector3.forward), HandleUtility.GetHandleSize(new Vector3(0.1f,0,0)),Handles.ArrowCap,1f); cuiPanel.ui2dBox.x=(xHandle-cuiPanel.transform.position).x; } public override void OnInspectorGUI() { CUIPanel cuiPanel=(CUIPanel) target; EditorGUIUtility.LookLikeInspector(); cuiPanel.ui2dBox=EditorGUILayout.Vector2Field("2D Box",cuiPanel.ui2dBox); } void Update () { } }
Currently, the whole thing misbehaves in several thing. First, if I drag the handle, it isn't picked at the point of click, but moves the box to this point. The result is, that the handle and the object jump. From there everything seems to work. as long as I don't rotate the object. From there, positioning fails and the box starts jumping back to a zero position after a while. Anyone any idea how to continue with this generally very useful mechanism? I think a reference snippet would be useful for others as well, as I haven't found any activity about this method at all.
Your answer
Follow this Question
Related Questions
EditorGUI.Slider positioning 1 Answer
Custom Handle. Mutliple Objects 0 Answers
How to prevent PositionHandle to become FreeMoveHandle when shift key is pressed 0 Answers
How to limit the amount of decimals with a slider in Unity Editor OnInspectorGUI? 1 Answer
How to create an undo-able slider in a custom Editor that allows range modification? 1 Answer