Jump to content
UnitySpain

Aceptamos donaciones vía Paypal.

UnitySpain.com es un servicio gratuito, pero mantener la Comunidad conlleva una serie de gastos.

Fondo Anual Unityspain: Donados 58,34€ de 150,00€

  • Servidor: Dominio.com y Hosting Web
  • Mantenimiento de los Foros
  • Contenido y Servicios Extras
  • Mantenimiento para Redes Sociales
Biarox1166

Duda con drag de imagen/ventana

Recommended Posts

Hola! Nuevamente traigo una duda esta vez una simple, creo yo. Verán tengo una imagen la cual simplemente quiero ser capaz de arrastrarla con el mouse, y si bien lo logré con OnDrag el problema es que se mueve desde lo que sería el centro de la imagen haciendo que cuando yo le de un click la imagen se "mueva" hasta que su centro coincida con la posición del mouse y recién ahí comienza el drag propiamente dicho(si bien se que yo mismo le digo que haga eso, no esncuentro la forma de hacer que se mueva desde la parte de la imagen que yo haya clickeado). Les dejo la script que tengo:

public class Arrastrar_Inventario : MonoBehaviour, IDragHandler
{

    public void OnDrag (PointerEventData eventData)
    {
        transform.position = eventData.position;
	}

}

Creo que la solución sea usar el eventData.pressPosition para obtener la posición del click y de ahí ejecutar el drag pero no encontré la forma de hacerlo. Gracias de antemano : )

Share this post


Link to post
Share on other sites

yo uso 2 vector3 uno para cuando haces click y otro para cuando se mueve el mouse luego saco la diferencia y se la añado a las coordenadas de la imagen y por ultimo copio la coordenada del actual en el anterior

Share this post


Link to post
Share on other sites

Buenas,

 

Es como dice @jeico008, se crea un Vector 2 con la posición del eventData - la imagen que quieres mover. Luego de nuevo restas la posición del eventData - el calculo anterior:

 

public void OnDrag(PointerEventData eventData)
    {
        offset = eventData.position - new Vector2(this.transform.position.x, this.transform.position.y);
        this.transform.position = eventData.position - offset;
    }

Yo he usado un Vector2, pero puedes hacerlo con un Vector3.

De hecho yo prefiero hacerlo así:

public void OnBeginDrag(PointerEventData eventData)
    {
        offset = eventData.position - new Vector2(this.transform.position.x, this.transform.position.y);
        this.transform.position = eventData.position - offset;
    }

    public void OnDrag(PointerEventData eventData)
    {
        this.transform.position = eventData.position - offset;
    }

Asi siempre tengo disponible el OnBeginDrag por si en un futuro quiero añadir algo al empezar a dragear, un evento, un efecto, un sonido, etc...

De esta manera primero guardas en la variable Offset la distancia que hay desde donde as clicado hasta la posición actual de la imagen. Y luego al cambiar la posición de la imagen y restarle el offset, consigues que la imagen se mantenga siempre a la misma distancia del ratón, creando el efecto de que arrastras desde donde as clicado.

 

Saludos,

Edited by datmos

Share this post


Link to post
Share on other sites

Gracias a ambos por la yuda pero tengo otra pregunta : p ¿Cómo podría hacer para que solo arrastre al objeto si clickeo en determinado espacio de este? Osea, por ejemplo solo voy a poder moverlo si hago click y arrastro desde la parte superior del objeto.

Share this post


Link to post
Share on other sites
31 minutes ago, Biarox1166 said:

Gracias a ambos por la yuda pero tengo otra pregunta : p ¿Cómo podría hacer para que solo arrastre al objeto si clickeo en determinado espacio de este? Osea, por ejemplo solo voy a poder moverlo si hago click y arrastro desde la parte superior del objeto.

Podrías usar un objeto invisible(si querés, o no) que sea el dragueable que estará en la parte que quieras (superior, der, centro, etc), pero al mover terminás moviendo "este" obj (lo que tenés hasta ahora) y el "resto". Podés lograr lo mismo enparentando el "resto" a "este" objeto, pero siempre que puedas mover sin enparentar mejor.

Edito: me olvidé de algo más básico, hacés el click y detectas si tal Rect contiene al punto clickeado, creo que con Rect.Contains lo podés hacer, pasa que con lo del objeto invisible lo podés hacer en el mismo editor.

Edited by lightbug

Share this post


Link to post
Share on other sites

hola @lightbug ! gracias por responder mira traté de usar el rect.contains(el cual me viene de maravilla para lo que quiero) el tema es que no se si lo implementé bien ya que no sucede nada y creé una variable bool la cual nunca cambia. Te dejo la script a ver si me puedes ayudar : p

public class Arrastrar_Inventario : MonoBehaviour, IDragHandler, IBeginDragHandler, IDropHandler , IPointerClickHandler
{
    private Vector2 offset;
    public Vector2 posInicial;
    private bool drag;

    void Start()
    {
        posInicial = transform.GetChild(0).transform.position;
    }

    public void OnPointerClick (PointerEventData eventData)
    {
        RectTransform r = transform.GetComponent<RectTransform>();
        if (r.rect.Contains(eventData.pressPosition))
        {
            drag = true;
        }
        else
        {
            drag = false;
        }
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        offset = eventData.position - new Vector2(this.transform.position.x, this.transform.position.y);
        this.transform.position = eventData.position - offset;
            
    }

    public void OnDrag(PointerEventData eventData)
    {
        if(drag)
            this.transform.position = eventData.position - offset;
    }
          public void OnDrop (PointerEventData eventData)
    {
        drag = false;
    }

}

 

Share this post


Link to post
Share on other sites
6 minutes ago, Biarox1166 said:

hola @lightbug ! gracias por responder mira traté de usar el rect.contains(el cual me viene de maravilla para lo que quiero) el tema es que no se si lo implementé bien ya que no sucede nada y creé una variable bool la cual nunca cambia. Te dejo la script a ver si me puedes ayudar : p

te pregunto algunas cosas que no soy mucho de usar los pointerEvents :

1 - el rect devuelve (de la doc):  " The calculated rectangle in the local space of the Transform. el meter hijos influirá en el resultado final? (hacé lo mismo pero para el evento OnMove y fijate si imprime el "true" ... sin drag claro)

2 - el "Click" ese que ponés de método, no consta de "apretar y soltar"? quizás deberías usar OnPointerDown y no click ?

de la doc:

public override void OnPointerClick(PointerEventData data)
{
Debug.Log("OnPointerClick called.");
}

public override void OnPointerDown(PointerEventData data)
{
Debug.Log("OnPointerDown called.");
}

saludos

Share this post


Link to post
Share on other sites

@lightbug por lo que decis del rect tenes razón la local pos del rect de la zona "draggeable" es 0,0,0 pero por el hecho del emparentamiento solo funciona en una esquina inferior. Y lo del OnMOve no funciona porque si no me equivoco es para eventos touch. Si se e ocurre otra forma(quizás como dices sin emparentar) porfa decimela y gracias por responder tan rápido : )

Share this post


Link to post
Share on other sites

×
×
  • Create New...