Hand tool on a 2D plane

Hello, I'm trying to do a simple 2D "hand tool". I got it working but I accidentally deleted something I thought was obsolete. As it turns out, my first try was a stroke of luck, since I haven't been able to make it work again.

I experience a bug where the camera flickers when i try to drag. I'm sure I'm not the first person to do a drag script (maybe the biggest n00b tho), but i cannot find any other documentation on this. Any input would be appreciated.

//SCROLL
var camCurrent : Vector3;   //static camera position
var pressedPosDif : Vector3; // difference between pressed and moved
var pressedPos: Vector3; //starting coordinates for button hold
var pressed:boolean = false; //is the button held?

//INITIATE
function Start(){
    camCurrent=camera.main.transform.position;
}

//UPDATE

function Update () {
    if (Input.GetMouseButtonDown(0)) {
        pressedPos = (Camera.main.ScreenToWorldPoint(Input.mousePosition));
        pressed = true;
        mouseCheck();
    }
}

function mouseCheck () {
    while (pressed) {
    pressedPosDif=pressedPos-(Camera.main.ScreenToWorldPoint(Input.mousePosition));
    Camera.main.transform.position=camCurrent+pressedPosDif;
    yield;
    if (Input.GetMouseButtonUp(0)) {
    camCurrent=Camera.main.transform.position;
            pressed = false;
        }
    }
}

Why pay money when there's good free alternatives? https://www.assetstore.unity3d.com/en/#!/content/12324

1 Answer

1

This seems like more work than you need.

Why not do something like:

MouseTranslate.js (Attached to the camera)

var scale : float = 0.2f
function Update() {
    if(Input.GetMouseButton(0)) {
        transform.position -= transform.right * Input.GetAxis("Mouse X") * scale;
        transform.position -= transform.up * Input.GetAxis("Mouse Y") * scale;
    }
}

For more precise movement, you could do some screen point converson:

MouseDragPosition.js (Attached to the camera)

var planeDistance : float = 10.0f;
private var dragPoint : Vector3 = Vector3.zero;
function Update() {
    var screenPoint : Vector3 = camera.ScreenToWorldPoint(Vector3(
                                    Input.mousePosition.x,
                                    Input.mousePosition.y,
                                    planeDistance));
    if(Input.GetMouseButtonDown(0)) dragPoint = screenPoint;
    else if(Input.GetMouseButton(0)) transform.position += dragPoint-screenPoint;
}

Hey thanks, for the answer, wasn't quite what I was looking for since it creates a "sliding" effect unlike the standard hand tool. Thanks for the effort though

You're concerned about 1:1-ish movement then? The Unity editor's hand tool is also subject to "sliding" as you call it, the further you move away. To mimic Unity's editor's hand tool more closely, you would simply a) subtract the movement instead of add and multiply the movement by some factor which you can play with as you like. I find 0.2f works nicely for objects 5 units in front of the camera. If you want/need more precise movement, you could do some calculation with the world point of the mouse position. Code to come.