Jump to content
Sign in to follow this  
martocapo

Tengo problemas con movetowards, quiero hacer un script de click to move

Recommended Posts

Hola a todos, la verdad que es dificil de conseguir ayuda en español para unity, asi que por eso estoy aca.

Les dejo mi problema:
Estoy queriendo hacer un script de click to move, osea mover el personaje donde hago click con el mouse y me esta moviendo siempre para la derecha, estoy usando MoveTowards, antes normalizo las coordenadas del mouse con ScreenToWorldPoint y veo que las coordenadas esta bien en la consola usando Debug.Log en el vector del mouse, puede ser porque estoy usando un vector2 para el movimiento como vos sugeriste? uso un Vector3 para el mouse porque el mouse usa la z y si quiero usar un vector2 me da error. Ademas al principio las coordenadas del mouse estaban mal porque no le asignaba el valor 10 a la z, ya que yo tengo una cámara Perspective y según leí tenes que hacer eso.
Espero que se entienda y puedas ayudarme, postie en unity answer en ingles y nadie me ayudo.
Desde ya muchas gracias
Les dejo el código
Quote

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ClickToMove2 : MonoBehaviour
{
    //private float speed = 1100;
    private Vector3 targetPosition;
    private Camera mainCamera;
    [SerializeField] private float movementSpeed;
    Animator Anim;

    // Update is called once per frame
    private void Start()
    {
        mainCamera = Camera.main;
        Anim = GetComponent<Animator>();
    }
    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            CalculateTargetPosition();
            MoveToTarget();
        }
        
    }
    void CalculateTargetPosition()
    {
        Vector3 mousePosition = Input.mousePosition;
        mousePosition.z = 10;
        //Debug.Log("Mouse: " + mousePosition);
        Vector3 transformedPosition = mainCamera.ScreenToWorldPoint(mousePosition);
        //Debug.Log("Mouse trans: " + transformedPosition);
        targetPosition = new Vector2(transformedPosition.x, transformedPosition.y);
        //Debug.Log("Mouse target: " + targetPosition);
    }

    private void MoveToTarget()
    {
        transform.position = Vector2.MoveTowards(new Vector2(transform.position.x, transform.position.y), targetPosition, Time.deltaTime * movementSpeed);
    }
}

Saludos desde Argentina ;)

Share this post


Link to post
Share on other sites

Mi personaje se movia a la derecha poruqe habia agregado una linea mientras estaba haciendo troubleshoting (rb.adforce), asi que la removi y ahora no hace nada.

Puede ser que este relacionado a que mi personaje se mueve con rb.adforce? les dejo el codigo

 Vector2 movement = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
         Rb.AddForce(movement * Time.deltaTime * speed2);
         if (Input.GetAxis("Horizontal") > 0)
         {
             Anim.SetTrigger("Right");
         }
         if (Input.GetAxis("Horizontal") < 0)
         {
             Anim.SetTrigger("Left");
         }
         if (Input.GetAxis("Vertical") > 0)
         {
             Anim.SetTrigger("Up");
         }
         if (Input.GetAxis("Vertical") < 0)
         {
             Anim.SetTrigger("Down");
         }
27 minutes ago, francoe1 said:

¿El problema en general es que no puedes obtener una posición "X" o que el transform no va a la posición "X" correctamente?

Gracias por responder, la posicion que obtengo con el mouse es correcto, de hecho la confirme imprimiendo el vector con Debug.Log, el problema creo es que mi personaje usa addforce para moverse, igualmente cree otro personaje con otro mecanismo de movimiento y tampoco se mueve, sinceramente estoy perdido jeje

Share this post


Link to post
Share on other sites

Quizás estás asignando la posición desde varios lugares.

Si quieres mover el personaje utilizando las físicas deberías obtener la dirección desde el transform al target y normalizarla luego aplicarla como velocidad, no es recomendable usar fuerzas para estos casos. 

Vector3 dir = (player.position - target.position).normalize;
player.rb.velocity = dir;

 

Share this post


Link to post
Share on other sites
On 12/7/2020 at 6:03 PM, francoe1 said:

Quizás estás asignando la posición desde varios lugares.

Si quieres mover el personaje utilizando las físicas deberías obtener la dirección desde el transform al target y normalizarla luego aplicarla como velocidad, no es recomendable usar fuerzas para estos casos. 


Vector3 dir = (player.position - target.position).normalize;
player.rb.velocity = dir;

 

Hola Genio, me diste una gran mano! logre hacer que funcione modificandolo un poco pero solo se mueve unos pasos digamos. No hace todo el recorrido hasta el punto del que seleccione con el mouse. Sabes como se podría lograr eso?

Ademas le agregue .InverseTransformDirection para saber si se mueve para adelante o para atras así animar el personaje.

Te dejo el script como quedo

public class ClicktoMove : MonoBehaviour
{

    float speed = 10;
    Rigidbody2D Rb;
    private Camera mainCamera;
    Animator Anim;
    private void Start()
    {
        Rb = GetComponent<Rigidbody2D>();
        mainCamera = Camera.main;
        Anim = GetComponent<Animator>();
    }
    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
         //   if (Input.GetMouseButtonUp(0))
        {
            Vector3 mousePosition = Input.mousePosition;
            mousePosition.z = 10;
            Vector3 point = mainCamera.ScreenToWorldPoint(mousePosition);
            Vector2 direction = point - transform.position;
            Rb.velocity = direction.normalized * speed;
            var localVel = transform.InverseTransformDirection(Rb.velocity);
            if (localVel.x > 0)
            {
                Anim.SetTrigger("Right");
            }
            if (localVel.x < 0)
            {
                Anim.SetTrigger("Left");
            }
            if (localVel.y > 0)
            {
                Anim.SetTrigger("Up");
            }
            if (localVel.y < 0)
            {
                Anim.SetTrigger("Down");
            }
        }
    }
}

 

Share this post


Link to post
Share on other sites

Solo se mueve un poco porque lo estás asignando dentro del bloque de la condición IF para evaluar si estás presionando el click.

private Vector3 pointTarget;
void Update()
{  
  Vector2 direction = pointTarget - transform.position;
  Rb.velocity = direction.normalized * speed;
  
  if (Input.GetMouseButtonDown(0))
  {
    Vector3 mousePosition = Input.mousePosition;
    mousePosition.z = 10;
    pointTarget = mainCamera.ScreenToWorldPoint(mousePosition);
    var localVel = transform.InverseTransformDirection(Rb.velocity);
    if (localVel.x > 0)
    {
      Anim.SetTrigger("Right");
    }
    if (localVel.x < 0)
    {
      Anim.SetTrigger("Left");
    }
    if (localVel.y > 0)
    {
      Anim.SetTrigger("Up");
    }
    if (localVel.y < 0)
    {
      Anim.SetTrigger("Down");
    }
  }
}

haciendo ese cambio funcionaria

Share this post


Link to post
Share on other sites
3 hours ago, francoe1 said:

Solo se mueve un poco porque lo estás asignando dentro del bloque de la condición IF para evaluar si estás presionando el click.


private Vector3 pointTarget;
void Update()
{  
  Vector2 direction = pointTarget - transform.position;
  Rb.velocity = direction.normalized * speed;
  
  if (Input.GetMouseButtonDown(0))
  {
    Vector3 mousePosition = Input.mousePosition;
    mousePosition.z = 10;
    pointTarget = mainCamera.ScreenToWorldPoint(mousePosition);
    var localVel = transform.InverseTransformDirection(Rb.velocity);
    if (localVel.x > 0)
    {
      Anim.SetTrigger("Right");
    }
    if (localVel.x < 0)
    {
      Anim.SetTrigger("Left");
    }
    if (localVel.y > 0)
    {
      Anim.SetTrigger("Up");
    }
    if (localVel.y < 0)
    {
      Anim.SetTrigger("Down");
    }
  }
}

haciendo ese cambio funcionaria

Hola gracias por responder, hice ese cambio y se empezó a mover solo hacia un lado jeje rarooo

Share this post


Link to post
Share on other sites
1 hour ago, martocapo said:

Hola gracias por responder, hice ese cambio y se empezó a mover solo hacia un lado jeje rarooo

Porque pointTarget es igual a Vector.zero si no tiene una asignación.. Tendrias que crear un flag para saber cuando tienen un target activo.

Share this post


Link to post
Share on other sites
2 hours ago, francoe1 said:

Porque pointTarget es igual a Vector.zero si no tiene una asignación.. Tendrías que crear un flag para saber cuando tienen un target activo.

Hola Franco, gracias por responder, hice lo que creo que entendí y sigue igual, osea solo avanza un poco. Te dejo el código para que si tenes tiempo lo veas.

Quizás usar Addforce?

Muchas gracias

 

Quote

 

    float speed = 10;
    Rigidbody2D Rb;
    private Camera mainCamera;
    Animator Anim;
    Vector3 point;
    private void Start()
    {
        Rb = GetComponent<Rigidbody2D>();
        mainCamera = Camera.main;
        Anim = GetComponent<Animator>();
    }
    // Update is called once per frame
    void Update()
    {
        //if (Input.GetMouseButtonDown(0))
        if (Input.GetMouseButtonUp(0))
        {
            Vector3 mousePosition = Input.mousePosition;
            mousePosition.z = 10;
            point = mainCamera.ScreenToWorldPoint(mousePosition);
            Move();
        }
        var localVel = transform.InverseTransformDirection(Rb.velocity);
        if (localVel.x > 0)
        {
            Anim.SetTrigger("Right");
        }
        if (localVel.x < 0)
        {
            Anim.SetTrigger("Left");
        }
        if (localVel.y > 0)
        {
            Anim.SetTrigger("Up");
        }
        if (localVel.y < 0)
        {
            Anim.SetTrigger("Down");
        }
    }
    void Move()
    {
        Vector2 direction = point - transform.position;
        Rb.velocity = direction.normalized * speed;
    }
    
 

 

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...