Created
August 4, 2015 12:15
-
-
Save seamanmur/e38e8ad5e9c815ce220a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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