/New Unity Project/Assets/Javascript Scripts/CameraControl.js
JavaScript | 169 lines | 134 code | 30 blank | 5 comment | 29 complexity | 8c735547fe725dd7c09daee82685bc6a MD5 | raw file
1#pragma strict 2 3public var TargetLookAt : Transform; 4 5public var Distance : float = 330.0; 6public var DistanceMin : float = 10.0; 7public var DistanceMax : float = 1000.0; 8private var mouseX : float = 0.0; 9private var mouseY : float = 0.0; 10private var startingDistance : float = 330.0; 11private var desiredDistance : float = 330.0; 12public var X_MouseSensitivity : float = 5.0; 13public var Y_MouseSensitivity : float = 5.0; 14public var MouseWheelSensitivity : float = 100.0; 15public var Y_MinLimit : float = 0.0; 16public var Y_MaxLimit : float = 330.0; 17public var DistanceSmooth : float = 0.05; 18private var velocityDistance : float = 0.0; 19private var desiredPosition : Vector3 = Vector3.zero; 20public var X_Smooth : float = 0.05; 21public var Y_Smooth : float = 0.1; 22private var velX : float = 0.0; 23private var velY : float = 0.0; 24private var velZ : float = 0.0; 25private var position : Vector3 = Vector3.zero; 26 27// map limits for wasd 28public var map_minX : float = 20; 29public var map_maxX : float = 284; 30public var map_minZ : float = 10; 31public var map_maxZ : float = 280; 32public var cur_X : float; 33public var cur_Z : float; 34public var moveSpeed : float = 10; 35public var FocusPoint : GameObject; 36public var cameraVector : Vector3; 37 38 39 40function Start() 41{ 42 43 FocusPoint = GameObject.FindWithTag("Focus"); 44 cur_X = FocusPoint.transform.position.x; 45 cur_Z = FocusPoint.transform.position.z; 46 Distance = Mathf.Clamp(Distance, DistanceMin, DistanceMax); 47 startingDistance = Distance; 48 Reset(); 49} 50 51function LateUpdate() 52{ 53 if (TargetLookAt == null) 54 return; 55 56 HandlePlayerInput(); 57 58 CalculateDesiredPosition(); 59 60 UpdatePosition(); 61} 62 63function HandlePlayerInput() 64{ 65 var deadZone = 0.01; // mousewheel deadZone 66 67 if (Input.GetMouseButton(1)) 68 { 69 mouseX += Input.GetAxis("Mouse X") * X_MouseSensitivity; 70 mouseY -= Input.GetAxis("Mouse Y") * Y_MouseSensitivity; 71 } 72 73 // this is where the mouseY is limited - Helper script 74 mouseY = ClampAngle(mouseY, Y_MinLimit, Y_MaxLimit); 75 76 // get Mouse Wheel Input 77 if (Input.GetAxis("Mouse ScrollWheel") < -deadZone || Input.GetAxis("Mouse ScrollWheel") > deadZone) 78 { 79 desiredDistance = Mathf.Clamp(Distance - (Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity), 80 DistanceMin, DistanceMax); 81 } 82 83 84 85 if (Input.GetKey(KeyCode.W)){ 86 cameraVector = FocusPoint.transform.position + Camera.mainCamera.transform.forward; 87 if (cameraVector.x > map_minX && cameraVector.x < map_maxX && cameraVector.z > map_minZ && cameraVector.z < map_maxZ){ 88 FocusPoint.transform.position += Camera.mainCamera.transform.forward; 89 cur_X = FocusPoint.transform.position.x; 90 cur_Z = FocusPoint.transform.position.z; 91 } 92 } 93 94 if (Input.GetKey(KeyCode.S)){ 95 cameraVector = FocusPoint.transform.position - Camera.mainCamera.transform.forward; 96 if (cameraVector.x > map_minX && cameraVector.x < map_maxX && cameraVector.z > map_minZ && cameraVector.z < map_maxZ){ 97 FocusPoint.transform.position -= Camera.mainCamera.transform.forward; 98 cur_X = FocusPoint.transform.position.x; 99 cur_Z = FocusPoint.transform.position.z; 100 } 101 } 102 103 if (Input.GetKey(KeyCode.A)){ 104 cameraVector = FocusPoint.transform.position - Camera.mainCamera.transform.right; 105 if (cameraVector.x > map_minX && cameraVector.x < map_maxX && cameraVector.z > map_minZ && cameraVector.z < map_maxZ){ 106 FocusPoint.transform.position -= Camera.mainCamera.transform.right; 107 cur_Z = FocusPoint.transform.position.z; 108 cur_X = FocusPoint.transform.position.x; 109 } 110 } 111 112 if (Input.GetKey(KeyCode.D)){ 113 cameraVector = FocusPoint.transform.position + Camera.mainCamera.transform.right; 114 if (cameraVector.x > map_minX && cameraVector.x < map_maxX && cameraVector.z > map_minZ && cameraVector.z < map_maxZ){ 115 FocusPoint.transform.position += Camera.mainCamera.transform.right; 116 cur_Z = FocusPoint.transform.position.z; 117 cur_X = FocusPoint.transform.position.x; 118 } 119 } 120} 121 122function CalculateDesiredPosition() 123{ 124 // Evaluate distance 125 Distance = Mathf.SmoothDamp(Distance, desiredDistance, velocityDistance, DistanceSmooth); 126 127 // Calculate desired position -> Note : mouse inputs reversed to align to WorldSpace Axis 128 desiredPosition = CalculatePosition(mouseY, mouseX, Distance); 129} 130 131function CalculatePosition(rotationX : float, rotationY : float, distance : float) 132{ 133 var direction : Vector3 = Vector3(0, 0, -distance); 134 var rotation : Quaternion = Quaternion.Euler(rotationX, rotationY, 0); 135 return TargetLookAt.position + (rotation * direction); 136} 137 138function UpdatePosition() 139{ 140 var posX = Mathf.SmoothDamp(position.x, desiredPosition.x, velX, X_Smooth); 141 var posY = Mathf.SmoothDamp(position.y, desiredPosition.y, velY, Y_Smooth); 142 var posZ = Mathf.SmoothDamp(position.z, desiredPosition.z, velZ, X_Smooth); 143 position = Vector3(posX, posY, posZ); 144 145 transform.position = position; 146 147 transform.LookAt(TargetLookAt); 148} 149 150function Reset() 151{ 152 mouseX = 0; 153 mouseY = 10; 154 Distance = startingDistance; 155 desiredDistance = Distance; 156} 157 158function ClampAngle(angle : float, min : float, max : float) 159{ 160 while (angle < -360 || angle > 360) 161 { 162 if (angle < -360) 163 angle += 360; 164 if (angle > 360) 165 angle -= 360; 166 } 167 168 return Mathf.Clamp(angle, min, max); 169}