Hola!
He hecho que, cuando mi player está cayéndose desde "x" altura, la cámara mire hacia el suelo, en plan "mira, te vas a estrellar",
y luego pierde el control de movimiento de la cámara mientras está cayendo, y lo recupera nuevamente cuando llega al suelo (si es que sobrevive).
_________________________________________________________________________________________________
Todo esto funciona perfecto.
Pero como problema es un poco raro, lo explicaré como si fueran pasos:
Me tiro por el precipicio.
Muevo la cámara hacia todos lados, simplemente para ver la transición de la cámara en cuanto comience a rotar hacia el suelo.
Cuando llego a "x" altura, la cámara empieza a hacerle focus al suelo, y aparte ya no puedo mover más la cámara (tal y como yo quiero).
Finalmente llego al suelo, y hago que el FOV de la cámara disminuya bastante para dar cierto efecto cuando choco contra el suelo.
Pasan unas milésimas de segundo y el FOV vuelve a la normalidad, y aparte ya tengo de nuevo el control de la cámara!
[EL PROBLEMA]: Lo que ocurre cuando me devuelve el control de la cámara (al final del en el paso nº5),
es que la rotación de la cámara vuelve a la posición en donde la dejé por última vez, en el paso nº2!!!
Ése es el problema!
Es decir,
me tiro...
me quedo mirando hacia el cielo (por ejemplo)...
la cámara comienza a encarar el suelo...
entonces llego al suelo y hace el efecto del fov, y oh sí todo muy genial...
y luego la cámara vuelve a mirar al cielo repentinamente como si Jesucristo le estuviese hablando.
_________________________________________________________________________________________________
Bueno, espero haberme hecho entender con esto.
Aquí pongo el código, para tratar de que no sea tan confuso:
using UnityEngine;
using System.Collections;
[DisallowMultipleComponent]
public class CameraHitGround : MonoBehaviour {
private GameObject _player;
private PlayerController _playerController = null;
private CameraController _cameraController = null;
private Transform _target;
private float _hitFOV = 20f;
private float _normalFOV = 72f;
private float _hitLerpSpeed = 10f;
private float _normalLerpSpeed = 0.05f;
private float _hitGroundCounter = 0f;
private float _rotationSpeed = 0.5f;
void Awake() {
_player = GameObject.Find("Player");
_playerController = _player.GetComponent<PlayerController>();
_cameraController = _player.GetComponentInChildren<CameraController>();
_target = GameObject.Find("Ground").transform;
}
void Update() {
// Cuando choca contra el suelo desde una larga caída...
if (_playerController.IsFalling && _playerController.MidAirCounter > 4f) {
_cameraController.CanMoveCamera = false;
// Hace que la cámara mire al "suelo", el cual en realidad es un empty gameobject que es hijo de mi player y que está colocado debajo de él...
var targetRotation = Quaternion.LookRotation(_target.transform.position - transform.position);
// Suaviza la rotación.
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, _rotationSpeed * Time.deltaTime);
}
if (_playerController.MidAirCounter > 4f && _playerController.CC.isGrounded) {
Camera.main.fieldOfView = Mathf.Lerp(Camera.main.fieldOfView, _hitFOV, _hitLerpSpeed * Time.deltaTime