Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

457
Views
¿Cómo puedo verificar si un objeto está orientado hacia una determinada dirección en Unity C#?

Todavía bastante nuevo en Unity y C#. Por lo general, puedo encontrar mi camino cuando se trata de configurar/cambiar la posición de un objeto, pero cuando se trata de la rotación, todavía me resulta alucinante, con cuaterniones, eulerangles, etc.

Estoy tratando de verificar si un objeto (una cabeza) está mirando hacia una dirección determinada, si no está mirando hacia esa dirección, debe configurarlo en esa dirección según la dirección hacia la que vaya (arriba, abajo, izquierda o derecha). Esto es para un juego de serpientes (como el antiguo juego de nokia de arriba hacia abajo) que estoy desarrollando actualmente.

Traté de buscarlo, pero ninguna de las respuestas es específica de lo que estoy tratando de hacer.

A partir de ahora, esto es lo que tengo para la entrada del jugador (un fragmento de código):

 private int GetAxisRaw(Axis axis) { if (axis == Axis.Horizontal) { bool left = Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A); bool right = Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D); if (left) { snakeHeadRotation.transform.Rotate(0, 180, 0); // Keeps rotating when left is pressed return -1; } if (right) { snakeHeadRotation.transform.Rotate(0, -180, 0); return 1; } return 0; }

Como puede ver, snakeHeadRotation.transform.Rotate(0, 180, 0); se llama cada vez que el jugador presiona la tecla izquierda, por ejemplo, girando así la cabeza de la serpiente incluso cuando la serpiente todavía se desplaza hacia la izquierda.

Mi lógica sería almacenar el valor de rotación en algún lugar (tal vez escriba Quaternion/bool) y verificar si ese valor de rotación coincide con el valor de rotación actual establecido a la izquierda (que es snakeHeadRotation.transform.Rotate(0, 180, 0) ;) Si ese es el caso, no hagas nada. Si no es así, configúrelo en snakeHeadRotation.transform.Rotate(0, 180, 0); por ejemplo.

el código sería algo así como (escribiéndolo):

 private int GetAxisRaw(Axis axis) { if (axis == Axis.Horizontal) { bool left = Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A); bool right = Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D); if (left && rotation is not equal to snakeHeadRotation.transform.Rotate(0, 180, 0)) { snakeHeadRotation.transform.Rotate(0, 180, 0); return -1; } if (right) { snakeHeadRotation.transform.Rotate(0, -180, 0); return 1; } return 0; }

Como dije, no estoy muy familiarizado con la configuración o el almacenamiento de valores de rotación. ¿Cómo puedo conseguir esto? ¿Es este el enfoque correcto o hay uno más lógico? No puedo resolver esto yo mismo..

Espero haberlo explicado bien, normalmente soy terrible para explicar las cosas.

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

El uso de Transform.Rotate(x) rotará su cabeza x grados en relación con la dirección actual de su cabeza.

Supongo que lo que quieres es establecer la rotación absoluta de tu cabeza dependiendo de la tecla de flecha que presiones. Por lo tanto, incluso si presiona varias veces la misma tecla de flecha, la cabeza permanecerá en la dirección correcta.

Para hacer eso, puede crear 4 rotaciones para cada dirección de la cabeza y usarlas según sea necesario. Por ejemplo, si su cabeza mira forward por defecto:

 // create your directions private static Quaternion forwardDirection = Quaternion.Identity; private static Quaternion rightDirection = Quaternion.FromToRotation(Vector3.forward, Vector3.right); private static Quaternion leftDirection = Quaternion.FromToRotation(Vector3.forward, Vector3.left); private static Quaternion backDirection = Quaternion.FromToRotation(Vector3.forward, Vector3.back); ... private int GetAxisRaw(Axis axis) { ... if (left) { // set the absolute direction of your head to the left snakeHeadRotation.transform.rotation = leftDirection; return -1; } if (right) { // set the absolute direction of your head to the right snakeHeadRotation.transform.rotation = rightDirection; return 1; } ... }
over 4 years ago · Santiago Trujillo Report

0

Simplemente crearía 4 cuaterniones para cada dirección y establecería la rotación de acuerdo con la tecla presionada (comohear.rotation = leftQ). Esta es la forma más sencilla.

Estoy lejos de mi PC actualmente, pero intentaré encontrar otra solución cuando pueda.

over 4 years ago · Santiago Trujillo Report

0

Puede comparar la rotación actual con las rotaciones conocidas para las 4 direcciones. Pero no vayas por ese camino, es una mala práctica por varias razones:

  • ¿Qué sucede si luego desea agregar animaciones, por ejemplo, la cabeza gira en 0,5 segundos, no instantáneamente?
  • comparar 4 flotadores solo para verificar una de las 4 direcciones posibles es ineficiente.

Crea una enumeración en su lugar:

 public enum Direction { Up, Down, Left, Right }

Agregue un miembro de este tipo a su comportamiento, para realizar un seguimiento de hacia dónde se dirige su cabeza de serpiente. Algo como:

 Direction direction; ... private int GetAxisRaw(Axis axis) { switch (direction) { case Direction.Up: if (left && !right) direction = Direction.Left; ... turn snake left ... else if (right && !left) direction = Direction.Right; ... turn snake right ... // ignore inputs for up or down if going up break; ... repeat for the other directions and possible inputs ... } ... }
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!