Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Arrastrar objeto

Iniciado por ecko, Noviembre 13, 2017, 03:34:23 PM

Tema anterior - Siguiente tema
Noviembre 13, 2017, 03:34:23 PM Ultima modificación: Noviembre 13, 2017, 10:05:30 PM por pioj
Buenas estoy retocando la funcion de arrastrar un objeto por la scena ya que cambié la cámara a modo perspective, pero resulta que si arrastro el objeto hacia un extremo se desplaza un poco el puntero del origen donde empecé arrastrandolo,
 
Aquí mi código:
 



   
       
   
   
      function OnMouseDrag(){
          var worldPos = Input.mousePosition;
          worldPos.z = 100;
          worldPos = Camera.main.ScreenToWorldPoint(worldPos);
          this.gameObject.transform.position=worldPos;
      }
   
   
      *Si
   
   
       
   

[/quote]
 
al arrastrar el objeto el puntero lo pone en  en centro del objeto, al moverlo a la esquina superior derecha el puntero se desplaza de su origen, si lo muevo a la esquina inferior izquierda el puntero se desplaza tambien de su origen pero distinto al de la esquina superior derecha, mi intención es que no se desplace el puntero del ratón, que este siempre quede fijado al origen donde empecé a arrastrar el objeto.
 
 

Hola, y si guardás el vector2 inicial del mousePosition? usando un flag que haga de "ya está ocupada". Algo así quizás (fijate mi JS que no se si está bien)
 

var m_drag : bool = false;
var m_mousePosInicial : Vector2;
function OnMouseDrag()
{
if(!m_drag){
   var m_mousePosInicial = Input.mousePosition;
   drag = true;
   
}

var worldPos = Input.mousePosition;
    worldPos.z = 100;
    worldPos = Camera.main.ScreenToWorldPoint(worldPos);
    this.gameObject.transform.position=worldPos;
}
//Por si sale, se resetea
function OnMouseExit()
{
drag = false;      
}
//Por si soltás el botón, se resetea
function OnMouseUp()
{
drag = false;      
}

 
 

Hola, primero gracias por la respuesta, he probado con tu código pero sigue haciendo lo mismo :S,no entiendo bien para que usaste la variable var m_mousePosInicial  ya que sólo se asigna pero no se usa

Noviembre 13, 2017, 04:42:38 PM #3 Ultima modificación: Noviembre 13, 2017, 04:43:05 PM por lightbug
Cita de: ecko date=1510585185Hola, primero gracias por la respuesta, he probado con tu código pero sigue haciendo lo mismo :S,no entiendo bien para que usaste la variable var m_mousePosInicial  ya que sólo se asigna pero no se usa
   


Jaja tenés razon, perdón. La idea a la que iba era que, más alla de como querés hacer lo que querés , cada vez a hagas drag por primera vez vas a tener guardada las pos del mouse, o con cualquier otra cosa funciona parecido, no me paré a pensar demasiado en como lo hacías. en resumen y dejando
 
El cursor del que hablás no se como lo implementas, si es el cursor "cursor" la verdad que no se como dejarlo en la posición (supongo que ya te tenés que ir más al lado del System o por lo menos de bajo Nivel para decir que se quede quieto ahí), pero por otro lado si fuera un cursor personalizado (Una textura que vas refrescando de posición en OnGUI ponele) con lo de arriba podés setear la pos del cursor a "mousePosInicial" para un dado estado, por ej a hacer drag (... = true), aunque no es la unica manera.

Creo que no es eso lo que necesito, me da la sensación que se debe a la perspectiva de la cámara que según su distancia hace que este objeto se desplace mas o menos hacia un lado, aquí una imagen de lo que hace el cursor desplazando el objeto en distintos puntos. (quisiera que el cursor quedase siempre como el de la foto central)

yo no entiendo muy bien lo que quieres, a que cursor te refieres? las flechas rojas??? esas las has dibujadado despues con paint, photoshop o algo, no?

Hola.
 
No se si esto te servirá.
 

using UnityEngine;
public class Arrastrar : MonoBehaviour {
    private GameObject target;
    private bool drag = false;
    private GameObject test;
    private Ray ray;
    private RaycastHit hit;
    private Vector3 worldPos;
    private float dist;
    void Start () {
        test = new GameObject();
        target = this.gameObject;
    }

void Update () {
        if (Input.GetKey(KeyCode.Mouse0))
        {
            if (!drag)
            {
                ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                if (Physics.Raycast(ray, out hit))
                {
                    drag = true;
                    test.transform.position = hit.point;
                    target.transform.SetParent(test.transform);
                    dist = Vector3.Distance(test.transform.position - target.transform.position, Camera.main.transform.position);
                }
            }
        }
        else
        {
            if (drag) {
                drag = false;
                target.transform.parent = null;
            }
        }
        if (drag)
        {
            worldPos = Input.mousePosition;
            worldPos.z = dist;
            worldPos = Camera.main.ScreenToWorldPoint(worldPos);
            test.transform.position = worldPos;
        }
    }
}

 
Lo que no tengo muy claro es lo de "worldPos.z = 100;"
 
Lo he sustituido por un valor calculado, que no afecta demasiado a lo que creo vas buscando.
 
El cursor permanece en el sitio donde pinchas.
 
No suelo intervenir en el foro porque mi nivel es muy bajo, pero esta vez me he atrevido, xD.
 
Si no te sirve no pasa na. A la papelera,

Etiquetas: