Estoy tratando de mover un objeto alrededor de mi reproductor en un juego de desplazamiento lateral 2.5d basado en la entrada del dispositivo analógico. La cuestión es que mi reproductor gira alrededor del mundo (con la cámara fija a un lado), por lo que su dirección horizontal local (transform.right) no siempre es la misma dirección global x para su dirección local ascendente (transform.up). Esto funcionó bien cuando la dirección de movimiento del jugador se fijó en el eje X al establecer un desplazamiento de la posición de los jugadores y agregar el análogo en el mismo eje de la siguiente manera:
Vector3 endPoint = new Vector3(transform.position.x + inputs.x * floraDistanceMultiplier, transform.position.y + inputs.y * floraDistanceMultiplier, transform.position.z);pero ahora que el jugador está "fuera del eje", por así decirlo, esto, por supuesto, no funciona.
Puedo hacer que funcione un eje a la vez:
Vector3 h = player.transform.position + player.transform.right * floraDistanceMultiplier * inputs.x; Vector3 v = player.transform.position + player.transform.up * floraDistanceMultiplier * inputs.y;Pero no pude averiguar cómo hacer que ambos vectores influyan en la posición final. Supongo que usar localPosition o aplicar x e y del vector final manualmente no funcionó porque x e y son siempre globales en lugar de definir la transformación. Correcto como una especie de eje X local.
Tuve la idea de engañar a los dos, lo que casi tiene resultados exitosos, ya que el punto final se mueve correctamente alrededor del jugador de izquierda a arriba, sin embargo, no en un círculo completo alrededor del jugador, y la diagonal está mucho más cerca que el completo. medida hacia arriba y hacia la izquierda.
Vector3 endPoint = Vector3.Lerp(h, v, inputs.x + inputs.y);¿Hay una mejor manera de hacer esto en general? ¿O hay alguna forma de leer entre 2 vectores usando 2 flotadores? (el stick analógico x e y) o usando un vector? ¡Gracias!
Lo que haces originalmente
var endPoint = new Vector3(transform.position.x + inputs.x * floraDistanceMultiplier, transform.position.y + inputs.y * floraDistanceMultiplier, transform.position.z);básicamente es igual a usar
var endPoint = transform.position + Vector3.right * input.x * floraDistanceMultiplier + Vector3.up * input.y * floraDistanceMultiplier; Entonces, para convertir esto en espacio local, simplemente reemplace los vectores globales Vector3.right y Vector3.up por los locales transform.right y transform.up ya deberían hacerlo.
var endPoint = transform.position + transform.right * input.x * floraDistanceMultiplier + transform.up * input.y * floraDistanceMultiplier;Otra forma de escribirlo un poco más corto sería
var endPoint = transform.position + (Vector3)input * floraDistanceMultiplier; y para convertir este en el espacio local simplemente multiplique ( operador Quaternion * Vector3 ) el vector de movimiento con la rotación del jugador
var endPoint = transform.position + transform.rotation * input * floraDistanceMultiplier; Como alternativa, si no necesita necesariamente el endPoint como vector, puede usar directamente transform.Translate donde simplemente puede decidir a través del segundo parámetro si desea aplicar el movimiento en el mundo o en el espacio local.
transform.Translate(input * floraDistanceMultiplier);Por defecto, esto ya mueve el objeto en el espacio local. Sin embargo, tenga en cuenta que aquí también se tiene en cuenta la escala de sus objetos. Entonces esto podría no comportarse como se esperaba.