- Home /
What is the mathematical formula for GUI dragging ?
Hi , when working with unity's GUI , there is a formula which is used when creating a drag behavior for GUI.Box, GUI.Button, GUI.DrawTexture etc....
I want to be able to drag any GUI no matter where on the GUI i click and drag . I just wrote this here but this code should do that . The problem is , my drag formula is wrong .
for example
public class DragSomething: EditorWindow
{
private Rect DrawTextureRect = new Rect(0, 0, 50, 50); // reck of gui we will drag
private bool Dragging ; // bool to check if we are dragging ...if mouse is down
private float Xpos, Ypos, Xwidth, Yheight; // so that we can work with each value
private Rect GUIposition(Vector2 mousePosition,Rect guiRect)
{
// our bad math formula which will drag our gui but actually just throws the gui into a corner ... literally
Xpos = mousePosition.x - DrawTextureRect.x; // if we had 540 as mousePosition.x and 500 as DrawTextureRect.x , Xpos would be equal to 40 ... which is very bad
Ypos = mousePosition.y - DrawTextureRect.y; // same here
Xwidth = DrawTextureRect .width;// this is fine
Yheight = DrawTextureRect .height;// this is fine too
return(new Rect(Xpos, Ypos, Xwidth, Yheight));
}
void OnGUI()
{
if (Event.current.type == EventType.MouseUp)
{
Dragging = false;
}
if (Event.current.type == EventType.MouseDown && DrawTextureRect.Contains (Event.current.mousePosition))
{
Dragging = true;
}
if(Dragging )
{
GUIposition(Event.current.mousePosition,DrawTextureRect); // give it the mouse position and the rect of the bui we want to drag
}
}
GUI.DrawTexture(DrawTextureRect,sometexture);
}
one thing I see is, you keep using the current mouse position, even after a drag is started- I'd think you would want to use an OFFSET from the drag start position(which you would need to record).
Answer by primemover · Mar 04, 2015 at 04:36 AM
When you capture mouse down in your Rect, find out how far you away from the Rects origin in x and y, then capture the mouse and subtract the x and y you found. Like what Glurth said.
Try this:
Make a Vector2 called cursorOffset.
Place this where you have Dragging = true, before it.
cursorOffset.x = Event.current.mousePosition.x - DrawTextureRect.x;
cursorOffset.y = Event.current.mousePosition.y - DrawTextureRect.y;
Then your math would be:
Xpos = Event.current.mousePosition.x - cursorOffset.x;
Ypos = Event.current.mousePosition.y - cursorOffset.y;
I think that might work.
also works . I guess the formula comes in different forms but it is essentially always the same .
Answer by DaiMangouDev · Mar 04, 2015 at 05:27 AM
I was given an example of offset usage which i had been unaware of
using UnityEngine;
using System.Collections;
using UnityEditor;
public class TestWindow : EditorWindow {
[MenuItem ("Window/Test Window")]
static void Init () {
// Get existing open window or if none, make a new one:
TestWindow window = (TestWindow)EditorWindow.GetWindow (typeof (TestWindow));
window.Show();
}
Texture2D pixel;
Rect windowRect;
bool isDragging;
Vector2 offset;
public TestWindow()
{
pixel = new Texture2D(1, 3, TextureFormat.ARGB32, true);
pixel.SetPixel(0, 0, new Color(1, 1, 1, 1));
pixel.Apply();
windowRect = new Rect(10,10,100,100);
isDragging = false;
offset = Vector2.zero;
}
void OnGUI()
{
//update
Event evt = Event.current;
switch(evt.type)
{
case EventType.MouseDown:
if(windowRect.Contains(evt.mousePosition))
{
isDragging=true;
//get offset from mouse
offset = evt.mousePosition - windowRect.position;
}
break;
case EventType.MouseUp:
isDragging = false;
break;
case EventType.MouseDrag:
if(isDragging)
{
windowRect.position = evt.mousePosition - offset;
}
break;
}
//render
GUI.DrawTexture(windowRect,pixel);
Repaint ();
}
Your answer
Follow this Question
Related Questions
Distribute terrain in zones 3 Answers
Multiple Cars not working 1 Answer