GOOGLE ADS

domingo, 17 de abril de 2022

¿Por qué no funciona mi intento de hacer un zoom de tirador FPS?

OBJETIVO

Estoy usando este script que obtuve de los foros de Unity para mover mi cámara. Funciona perfectamente y este es exactamente el estilo de cámara que quiero. Aquí está en acción:

https://streamable.com/j7ozps

Quería crear un efecto de zoom cuando el usuario mantiene presionado el botón derecho del mouse.

PROBLEMA

Después de hacer zoom, el objetivo se desvía mucho. Esto es lo que sucede:
https://streamable.com/8aiil0

MI INTENTO

void Update () {
if (Input.GetMouseButton(1))
{
int layerMask = 1 << CombatManager.GROUND_LAYER; // -> public const int GROUND_LAYER = 8;
Ray mouseClick = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit[] hitInfos;
float maxDistance = 100.0f;
hitInfos = Physics.RaycastAll(mouseClick, maxDistance,
layerMask, QueryTriggerInteraction.Ignore);
mainCamera.fieldOfView = 10;
mainCamera.transform.LookAt(hitInfos[0].point);
}
else
mainCamera.fieldOfView = startingFieldOfView;

También intenté cambiar el orden de LookAt y la asignación del campo de visión.

¿Qué estoy haciendo mal?


Solución del problema

Parece que lo que desea es hacer zoom hacia la posición del cursor, no hacia donde golpea el rayo, que probablemente no sea el mismo punto. Para verificar eso, puede dibujar un cubo de depuración donde golpea el rayo, para verificar si el punto que está mirando es el que necesita, así:

GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.position = hitInfos[0].point;

Verifique Camera.ScreenToWorldPoint que le brinda el punto del espacio mundial creado al convertir el punto del espacio de la pantalla a la distancia z proporcionada desde el plano de la cámara.

Lo que intentaría:

Vector3 point = Camera.main.ScreenToWorldPoint(Input.mousePosition);
//check if this is the point you want to look at
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.position = point;
//look at it
mainCamera.transform.LookAt(point);

No debería importar si está utilizando cam.nearClipPlaneo cam.farClipPlaneen la ScreenToWorldPointfunción, pero jugaría con eso en caso de que algo no funcione como se esperaba.

Vector3 screenPoint = Input.mousePosition;
screenPoint.z = Camera.main.farClipPlane;
Vector3 worldPoint = Camera.main.ScreenToWorldPoint(screenPoint);

No hay comentarios:

Publicar un comentario

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...