Skip to content

Instantly share code, notes, and snippets.

@seamanmur
Created August 4, 2015 12:15
Show Gist options
  • Save seamanmur/e38e8ad5e9c815ce220a to your computer and use it in GitHub Desktop.
Save seamanmur/e38e8ad5e9c815ce220a to your computer and use it in GitHub Desktop.
using UnityEngine;
class CharTPSCamera : MonoBehaviour
{
public static CharTPSCamera instance;
public Transform target;
public float Distance { get; set; }
private const float _START_DISTANCE = 2f;
private const float _DISTANCE_MIN = _START_DISTANCE;
private const float _DISTANCE_MAX = 12f;
private float _mouseX;
private float _mouseY;
private float _desireDistance;
//Константы - чувствительность мыши в горизонтальном, вертикальном направлениях и чувствительность колесика
private const float _X_MOUSE_SENSITIVITY = 5f;
private const float _Y_MOUSE_SENSITIVITY = 5f;
private const float _MOUSE_WHEEL_SENSITIVITY = 5f;
//"Мертвая зона" внутри которой не реагируем на вращение колесика мышки
private const float _DEAD_ZONE = 0.01f;
//Ограничения вращения по вертикали - минимальное и максимальное
private const float _Y_MIN_LIMIT = -40f;
private const float _Y_MAX_LIMIT = 80f;
void Awake()
{
instance = this;
}
void Start()
{
Distance = Mathf.Clamp(Distance, _DISTANCE_MIN, _DISTANCE_MAX);
Reset();
}
void LateUpdate()
{
if (target == null) return;
PlayerInput();
CalcDesirePosition();
UpatePosition();
}
private void PlayerInput()
{
//Проеряем - нажата ли правая кнопка мыши
if (Input.GetMouseButtonDown(1))
{
//Нажата - рассчитываем смещения с учетом чувствительности мыши
_mouseX += Input.GetAxis("Mouse X") * _X_MOUSE_SENSITIVITY;
_mouseY -= Input.GetAxis("Mouse Y") * _Y_MOUSE_SENSITIVITY;
}
//Ограничиваем вращение по вертикали с учетом того, что оно может выходить за пределы диапазона [-360;360]
_mouseY = Utils.ClampAngle(_mouseY, _Y_MIN_LIMIT, _Y_MAX_LIMIT);
//Данные с колесика мышки
float scroll = Input.GetAxis("Mouse ScrollWheel");
//Если вышли за пределы "мертвой зоны"
if (scroll < -_DEAD_ZONE || scroll > _DEAD_ZONE)
{
//Рассчитываем желаемое расстояние от камеры до персонажа
//Введенное значение умножаем на чувствительность, вычитаем его из текущего расстояния и ограничиваем сверху и снизу
_desireDistance = Mathf.Clamp(Distance - scroll * _MOUSE_WHEEL_SENSITIVITY, _DISTANCE_MIN, _DISTANCE_MAX);
}
}
private void CalcDesirePosition()
{
}
private Vector3 CalcPosition(float rotx, float roty, float distance)
{
}
public void Reset()
{
_mouseX = 0;
_mouseY = 10f;
Distance = _START_DISTANCE;
_desireDistance = Distance;
}
private void UpatePosition()
{
}
static public void GetCamera()
{
GameObject tempCamera;
GameObject targetTemp;
CharTPSCamera myCamera;
if (Camera.mainCamera != null) tempCamera = Camera.mainCamera.gameObject;
else
{
tempCamera = new GameObject("Main Camera");
tempCamera.AddComponent("Camera");
tempCamera.tag = "Main Camera";
}
tempCamera.AddComponent("CharTPSCamera");
myCamera = tempCamera.GetComponent();
targetTemp = GameObject.Find("targetLookAt");
if (targetTemp == null)
{
targetTemp = new GameObject("targetLookAt");
targetTemp.transform.position = Vector3.zero;
}
myCamera.target = targetTemp.transform;
}
}
//Новый вспомогательный статический класс
internal static class Utils
{
//метод для ограничения угла поворота
public static float ClampAngle(float angle, float min, float max)
{
//Делаем
do
{
//Если угол меньше -360 прибавляем к нему 360
if (angle < -360) angle += 360;
//Если больше 360 - вычитем
if (angle > 360) angle -= 360;
//Пока он не окажется в диапазоне [-360;360]
} while (angle < -360 || angle > 360);
//Возвращаем ограничив сверху и снизу
return Mathf.Clamp(angle, min, max);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment