c# - tag - Ratón basado en el objetivo de Unity3d
unity destroy gameobject (1)
Estoy haciendo un juego de disparos de bala de cañón. aquí hay un código corto en el que estoy calculando la dirección de orientación.
Vector3 mousePos = Input.mousePosition;
mousePos.z = thisTransform.position.z - camTransform.position.z;
mousePos = mainCamera.ScreenToWorldPoint (mousePos);
Vector3 force = mousePos - thisTransform.position;
force.z = force.magnitude;
Esto funciona cuando ambos bola y en ángulo (0,0,0). Pero cuando el ángulo cambia, no puedo disparar en la dirección correcta.
Supongamos que tanto la bola como la cámara miran a 45 grados en el lado derecho, el mismo código no funciona.
El código actual asume que ambos están en el ángulo (0,0,0). Entonces, en el caso mencionado anteriormente, la dirección de lanzamiento siempre es incorrecta.
Quiero tirar la pelota en la dirección que sea. Pero asúmalo como 0 ángulo y lanza en consecuencia.
Usar Camera.ScreenToWorldPoint
es incorrecto en esta situación.
Deberías usar raycasting contra un avión. Aquí hay una demostración sin matemática innecesaria:
Raycasting te da la ventaja de que no tienes que adivinar qué tan "profundo" hizo clic el usuario (la coordenada z
).
Aquí hay una implementación simple de lo anterior:
/// <summary>
/// Gets the 3D position of where the mouse cursor is pointing on a 3D plane that is
/// on the axis of front/back and up/down of this transform.
/// Throws an UnityException when the mouse is not pointing towards the plane.
/// </summary>
/// <returns>The 3d mouse position</returns>
Vector3 GetMousePositionInPlaneOfLauncher () {
Plane p = new Plane(transform.right, transform.position);
Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
float d;
if(p.Raycast(r, out d)) {
Vector3 v = r.GetPoint(d);
return v;
}
throw new UnityException("Mouse position ray not intersecting launcher plane");
}
Demonstation: https://github.com/chanibal/Muy-Generic-Missle-Command