Mi problema es que cuando me muevo contra una pared, hay un pequeño efecto de rebote. Aquí hay un video de ello: https://www.dropbox.com/s/t5drxu4aw60nq59/meem.mp4?dl=0
No sé cómo solucionarlo, ya probé todo. Espero que alguien sepa una solución para esto. Gracias Aquí está el guión del movimiento:
public class PlayerMovement : MonoBehaviour { public float speed; public float x; public float y; public bool canMove; void FixedUpdate() { if (canMove) { if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W)) { GoUp(); } else if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S)) { GoDown(); } else if (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D)) { GoRight(); } else if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A)) { GoLeft(); } if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.RightArrow)) { GoUp(); GoRight(); } else if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.LeftArrow)) { GoUp(); GoLeft(); } else if (Input.GetKey(KeyCode.DownArrow) && Input.GetKey(KeyCode.RightArrow)) { GoDown(); GoRight(); } else if (Input.GetKey(KeyCode.DownArrow) && Input.GetKey(KeyCode.LeftArrow)) { GoDown(); GoLeft(); } this.transform.position = new Vector2(this.transform.position.x + x, this.transform.position.y + y); x = 0; y = 0; } } public void GoUp() { y = Time.deltaTime * speed; } public void GoDown() { y = Time.deltaTime * (-speed); } public void GoRight() { x = Time.deltaTime * speed; } public void GoLeft() { x = Time.deltaTime * (-speed); } }Encuentre dos sugerencias para manejar el ejemplo de dejar de ir bien. Tenga en cuenta que no serán código depurado, ya que no conozco los detalles de su proyecto. Tampoco es el más correcto en muchos aspectos por la misma razón. Solo para darte una idea.
1.- Con control a distancia
public GameObject wall; //ref to wall set in editor float playerHalfSize = 0f; float wallHalfSize = 0f; float bodiesTotDist = 0f; Start() { playerHalfSize = transform.scale.x / 2; wallHalfSize = wall.scale.x / 2; // supposing size is set with scale. Preferably get the size with a collider or the mesh renderer Bounds class inside the respective collider or MeshRenderer classes bodiesTotDist = playerHalfSize + wallHalfSize; } float getDistanceToWall(wall) { float distance = Vector3.Distance(transform.position, wall.transform.position) - bodiesTotDist; } public void GoRight() { if (getDistanceToWall() > 0) //this avoids your player x move further to the right x = Time.deltaTime * speed; } Si aún puede ver el rebote, puede intentar ajustar manualmente una distancia de umbral, por ejemplo, getDistanceToWall() > 0.5f o adjuntar el colisionador.
2.- Con un gatillo: Si pones un gatillo un poco más grande que tu pared, cuando la pared toque al jugador puedes manejarlo en el código también para evitar que se x más a la derecha.
bool isRightWallTouching = false; void OnTriggerEnter2D(Collider2D col) { if (col.gameObject == wall) //for the right wall isRightWallTouching = true; } void OnTriggerExit2D(Collider2D other) { isRightWallTouching = false; } public void GoRight() { if (isRightWallTouching > 0) //this avoids your player x move further to the right x = Time.deltaTime * speed; }Como se dijo, el código no está depurado, por lo que podría tener algunas fallas y la posibilidad de que tenga muchas paredes, por lo que esta sugerencia puede conducir a una gran cantidad de soluciones sucias, pero espero que pueda brindarle algo de inspiración para poner su juego a trabajar y moverse. sobre :)