martocapo 1 Report post Posted December 7, 2020 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
francoe1 536 Report post Posted December 7, 2020 ¿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? Share this post Link to post Share on other sites
martocapo 1 Report post Posted December 7, 2020 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
francoe1 536 Report post Posted December 7, 2020 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
martocapo 1 Report post Posted December 10, 2020 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
francoe1 536 Report post Posted December 11, 2020 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
martocapo 1 Report post Posted December 11, 2020 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
francoe1 536 Report post Posted December 11, 2020 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
martocapo 1 Report post Posted December 11, 2020 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
francoe1 536 Report post Posted December 11, 2020 No, Move() se llamará una única vez, esa no es la forma correcta, creo no estás entendiendo. Share this post Link to post Share on other sites