c# - varios - unity3d text ui
Mostrar objeto delante del jugador siempre (2)
Probablemente esta no sea una respuesta completa sino algo que podría ayudar. Esta línea:
Vector3 navCanvas = camRotationToWatch.transform.position + camRotationToWatch.transform.forward * navCanvasDisplayDistanceFromCam;
Está creando una posición a una distancia fija de camRotationToWatch
. Pero si ese objeto está mirando hacia arriba o hacia abajo, esa posición no está horizontalmente en navCanvasDisplayDistanceFromCam
. Si está mirando hacia arriba, entonces esta posición es, de hecho, directamente arriba.
Entonces cuando haces esto para establecer una altura vertical fija:
navCanvas = new Vector3(navCanvas.x, 2f, navCanvas.z);
no estás obteniendo la distancia de camRotationToWatch
que crees que eres. En lugar de utilizar camRotationToWatch.transform.forward
, cree un vector a partir de él, camRotationToWatch.transform.forward
cero el componente Y y normalícelo antes de usarlo para compensar la posición. (Sin embargo, tendrá que tener cuidado con los vectores de longitud cero). Ya sea que resuelva tu problema o no, es muy difícil de adivinar, pero debería ayudar a mejorar algunos resultados.
EDITAR: Aquí hay un ejemplo de cómo puede evitar el problema con el lienzo demasiado cerca:
Vector3 camForward = camRotationToWatch.transform.forward;
camForward.y = 0;
if (camForward.magnitude == 0)
{
//TODO: you''ll need to decide how to deal with a straight up or straight down vector
}
camForward.Normalize();
//Note: now you have a vector lying on the horizontal plane, pointing in
//the direction of camRotationToWatch
Vector3 navCanvas = camRotationToWatch.transform.position + camForward *
navCanvasDisplayDistanceFromCam;
//Note: if you want the canvas to be at the player''s height (or some offset from),
//use the player''s y
navCanvas = new Vector3(navCanvas.x, Player.transform.y, navCanvas.z);
navigationCanvas.transform.position = navCanvas;
Nuevamente, esto podría no solucionar todos sus problemas, pero ayudará a asegurar que su lienzo quede a una distancia establecida horizontalmente del Reproductor y también compensará el movimiento hacia arriba y hacia abajo del jugador.
Me he quedado atrapado en este simple problema, pero no puedo entender por qué no puedo controlarlo.
Tengo esta línea de código que muestra mi objeto canvas delante de mi reproductor (el nombre del objeto camRotationToWatch en el código) en cierta rotación del jugador.
if (camRotationToWatch.transform.localEulerAngles.x >= navigationCanvasXMinmumLimit && camRotationToWatch.transform.localEulerAngles.x <= navigationCanvasXMaximumLimit)
{
if (!navCanvasHasDisplay)
{
navigationCanvas.SetActive(true);
//Debug.Log(camRotationToWatch.transform.forward);
Vector3 navCanvas = camRotationToWatch.transform.position + camRotationToWatch.transform.forward * navCanvasDisplayDistanceFromCam;
navCanvas = new Vector3(navCanvas.x, 2f, navCanvas.z);
navigationCanvas.transform.position = new Vector3(navCanvas.x, navCanvas.y, navCanvas.z);
navigationCanvas.transform.rotation = camRotationToWatch.transform.rotation;
navCanvasHasDisplay = true;
}
}
else
{
//navigationCanvas.SetActive(false);
if (locationPanel.activeSelf == false && infoPanel.activeSelf == false) {
navigationCanvas.SetActive(false);
navCanvasHasDisplay = false;
}
}
Este código funciona realmente bien cuando el objeto camRotationToWatch gira de abajo hacia arriba y muestra el lienzo en la posición correcta, pero cuando trato de girar el control de rotación de cámara hacia arriba y hacia abajo , muestra el lienzo (activo) en la posición más alta. ¿Cómo puedo restringir el lienzo para que se muestre en la misma posición ( No importa que el jugador gire de arriba a abajo o hacia arriba o hacia arriba ) sino que aparezca en la parte frontal del objeto del jugador?
Un poco difícil de tratar de averiguar qué es exactamente lo que quieres hacer. Pero esto hizo lo que creo que intentabas hacer
public GameObject follow; // The object you want to rotate around
public float distance = 2; // Distance to keep from object
private void Update() {
Vector3 forward = follow.transform.forward;
forward.y = 0; // This will result in Vector3.Zero if looking straight up or down. Carefull
transform.position = follow.transform.position + forward * distance;
transform.rotation = Quaternion.LookRotation(forward, Vector3.up);
}
Creo que su "comportamiento inesperado" se debe al uso de ángulos euler, ya que no siempre son totalmente predecibles. Pruebe usar Quaternions o Vector3.Angle () cuando sea posible.
Si desea limitar el ángulo (por ejemplo ... si mira hacia abajo o hacia arriba más de 45 ° deshabilita el objeto), puede hacer lo siguiente:
if (Vector3.Angle(forward, follow.transform.forward) > maxAngle) { ... }