- Home /
How to drag object in direction of camera?
I have this little script for dragging object in my level editor:
using UnityEngine;
using System.Collections;
public class DragTile : MonoBehaviour {
//declaring some variables
private bool mousedwn;
private Vector3 oldMousePosition;
private float traveleddistX,traveleddistY = 0;
void OnMouseDown() {
if (!GameData.freemove){
mousedwn = true;
}
}
void OnMouseUp() {
mousedwn = false;
}
void Start(){
oldMousePosition = Input.mousePosition;
}
// Update is called once per frame
void Update () {
if (!GameData.freemove){
if ((mousedwn) && (Input.GetMouseButton(0))){
if (Input.GetButton("Control")){
if ((this.oldMousePosition.x<Input.mousePosition.x) && (traveleddistX>=5)){
this.transform.Translate(0.25f,0,0);
traveleddistX = 0;
}
if ((this.oldMousePosition.x>Input.mousePosition.x) && (traveleddistX>=5)){
this.transform.Translate(-0.25f,0,0);
traveleddistX = 0;
}
if ((this.oldMousePosition.y<Input.mousePosition.y) && (traveleddistY>=5)){
this.transform.Translate(0,0,0.25f);
traveleddistY = 0;
}
if ((this.oldMousePosition.y>Input.mousePosition.y) && (traveleddistY>=5)){
this.transform.Translate(0,0,-0.25f);
traveleddistY = 0;
}
} else {
//this.transform.Translate(Input.GetAxis("Mouse X"),0,Input.GetAxis("Mouse Y"),Space.World);
if ((this.oldMousePosition.x<Input.mousePosition.x) && (traveleddistX>=5)){
this.transform.Translate(0.125f,0,0);
traveleddistX = 0;
}
if ((this.oldMousePosition.x>Input.mousePosition.x) && (traveleddistX>=5)){
this.transform.Translate(-0.125f,0,0);
traveleddistX = 0;
}
if ((this.oldMousePosition.y<Input.mousePosition.y) && (traveleddistY>=5)){
this.transform.Translate(0,0,0.125f);
traveleddistY = 0;
}
if ((this.oldMousePosition.y>Input.mousePosition.y) && (traveleddistY>=5)){
this.transform.Translate(0,0,-0.125f);
traveleddistY = 0;
}
}
}
traveleddistX += Mathf.Abs(this.oldMousePosition.x-Input.mousePosition.x);
traveleddistY += Mathf.Abs(this.oldMousePosition.y-Input.mousePosition.y);
oldMousePosition = Input.mousePosition;
}
}
}
Problem is, that it doesn't take camera's orientation into consideration. This hurts, because when rotating camera by 180 degrees "tiles" are moving upwards when moving mouse downwards and when rotating camera by 90 deg., moving mouse upwards results in visible movement of left/right.
How to prevent that?
//edit: My editor features freemove camera (think of Minecraft's Creative mode or fly mod) and I want only move things in x/z plane.
Answer by darkhog · Jan 12, 2013 at 05:04 AM
Fixed with help of HPJ_ on IRC. Current code (if someone will have similar problem in future):
using UnityEngine;
using System.Collections;
public class DragTile : MonoBehaviour {
//declaring some variables
private bool mousedwn;
private Vector3 oldMousePosition;
private float traveleddistX,traveleddistY = 0;
void OnMouseDown() {
if (!GameData.freemove){
mousedwn = true;
}
}
void OnMouseUp() {
mousedwn = false;
}
void Start(){
oldMousePosition = Input.mousePosition;
}
// Update is called once per frame
void Update () {
if (!GameData.freemove){
if ((mousedwn) && (Input.GetMouseButton(0))){
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Input.GetButton("Control")){
float dist =0;
Plane WorldPlane = new Plane(new Vector3(0,1,0),new Vector3(0,0,0));
WorldPlane.Raycast(ray,out dist);
Vector3 TargetPosition = ray.GetPoint(dist);
//this.transform.position = Vector3.MoveTowards(this.transform.position, TargetPosition, 0.25f);
Vector3 TargetPosition2 = new Vector3 (
( Mathf.RoundToInt ( TargetPosition.x * 4.0f ) ) / 4.0f ,
( Mathf.RoundToInt ( TargetPosition.y * 4.0f ) ) / 4.0f ,
( Mathf.RoundToInt ( TargetPosition.z * 4.0f ) ) / 4.0f );
this.transform.position = TargetPosition2;
} else {
float dist =0;
Plane WorldPlane = new Plane(new Vector3(0,1,0),new Vector3(0,0,0));
WorldPlane.Raycast(ray,out dist);
Vector3 TargetPosition = ray.GetPoint(dist);
Vector3 TargetPosition2 = new Vector3 (
( Mathf.RoundToInt ( TargetPosition.x * 8.0f ) ) / 8.0f ,
( Mathf.RoundToInt ( TargetPosition.y * 8.0f ) ) / 8.0f ,
( Mathf.RoundToInt ( TargetPosition.z * 8.0f ) ) / 8.0f );
this.transform.position = TargetPosition2;
}
}
traveleddistX += Mathf.Abs(this.oldMousePosition.x-Input.mousePosition.x);
traveleddistY += Mathf.Abs(this.oldMousePosition.y-Input.mousePosition.y);
oldMousePosition = Input.mousePosition;
}
}
}
Your answer
Follow this Question
Related Questions
Multiple Cars not working 1 Answer
Problem with dragging objects 1 Answer
Distribute terrain in zones 3 Answers
Trying to trigger multiple objects by holding down the mouse with OnMouseDown 1 Answer
Overlapping GUI Button priority 3 Answers