Посмотри эту камеру
Код
using UnityEngine;
using System.Collections;
/// ГЛАВНАЯ КАМЕРА
/// Описание:
/// Камера следит за игроком.
/// Местоположение камеры фиксированое и изменять его нельзя
/// Но возможно вращение по оси Х при зажатии колесика мыши.
/// При этом после того как колесико будет отпущено, камера
/// вернется в свое изначально местоположение
///
public class GeneralCamera : MonoBehaviour
{
public GameObject Target; //цель камеры
public float MaxDistance;//максимальная дистанция
public float MinDistance;//минимальная дистанция приближения камеры
public float Height;//высота расположения камеры относительно модели
public float XSpeed = 250;//скоро поворота
public float YSpeed = 120;//
public bool CameraRotation;//возможно ли изменения позиции камеры
public float HeightDamping = 2f;//высота торможения
public float RotationDamping = 3f;//скорость торможения при вращении
Transform localTrans;
float x;
float y;
void Awake()
{
localTrans = transform;//кешируем переменную
Target = GameObject.FindGameObjectWithTag(ManagerTag.CAMERA_TARGET);//присваиваем значение
}
void Start()
{
if (Target == null)
Debug.LogError("Не указана цель камеры");
else
StartCameraPosition();
}
void Update()
{
//если нажата кнопка мышки, камеру можно вращать
if (Input.GetButtonDown("Rotate mouse button"))
{
CameraRotation = true;
}
if (Input.GetButtonUp("Rotate mouse button"))
{
CameraRotation = false;
x = 0;
y = 0;
}
}
void LateUpdate()
{
if (CameraRotation)
{
//используем параметры Input
x += Input.GetAxis("Mouse X") * XSpeed * 0.02f;
y -= Input.GetAxis("Mouse Y") * YSpeed * 0.02f;
cameraRotate();
}
else
{
// Вычесляем текущие углы
float wantedRotationAngle = Target.transform.eulerAngles.y;
float wantedHeight = Target.transform.position.y + Height;
float currentRotationAngle = transform.eulerAngles.y;
float currentHeight = transform.position.y;
// Демпфировать вращение вокруг y-axis.
currentRotationAngle = Mathf.LerpAngle(currentRotationAngle, wantedRotationAngle, RotationDamping * Time.deltaTime);
// Демпфировать высоту
currentHeight = Mathf.Lerp(currentHeight, wantedHeight, HeightDamping * Time.deltaTime);
// Преобразовуем угол в rotation
Quaternion currentRotation = Quaternion.Euler(0, currentRotationAngle, 0);
// Устанавливаем позицию камеры на x-z координатах
transform.position = Target.transform.position;
transform.position -= currentRotation * Vector3.forward * MaxDistance;
// Высота камеры
localTrans.LookAt(Target.transform);
}
}
///метод в котором расчитываем поворот камеры
void cameraRotate()
{
Quaternion rotate = Quaternion.Euler(y, x, 0);
var posit = rotate * new Vector3(0, 0, -MaxDistance) + Target.transform.position;
localTrans.rotation = rotate;
localTrans.position = posit;
}
///метод отвечающий за установку камеры на стартовую позицию
public void StartCameraPosition()
{
localTrans.position = new Vector3(Target.transform.position.x, Target.transform.position.y - Height, Target.transform.position.z - MaxDistance);
localTrans.LookAt(Target.transform);
}
}