using UnityEngine; public class PlayerCameraController : MonoBehaviour { public Transform target; public float distance = 50.0f; public float xSpeed = 1.0f; public float ySpeed = 20.0f; public float yMinLimit = 5; public float yMaxLimit = 130f; public float zoomSpeedDesktop = 20f; public float zoomSpeedMobile = 20f; public float distanceMin = 10f; public float distanceMax = 150f; public float smoothTime = 2f; float rotationYAxis = 0.0f; float rotationXAxis = 0.0f; float velocityX = 0.0f; float velocityY = 0.0f; // Use this for initialization void Start() { Vector3 angles = transform.eulerAngles; rotationYAxis = angles.y; rotationXAxis = angles.x; // Make the rigid body not change rotation if (GetComponent()) { GetComponent().freezeRotation = true; } } void LateUpdate() { if (target) { Vector2 movementInputDelta = Vector2.zero; if (SystemInfo.deviceType == DeviceType.Handheld) { if (Input.touchCount == 1) { movementInputDelta = Input.touches[0].deltaPosition * 0.02f; } } else { if (Input.GetMouseButton(0)) { movementInputDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")); } } movementInputDelta *= 0.2f; velocityX = xSpeed * movementInputDelta.x * distance; velocityY = ySpeed * movementInputDelta.y; rotationYAxis += velocityX; rotationXAxis -= velocityY; rotationXAxis = ClampAngle(rotationXAxis, yMinLimit, yMaxLimit); //Quaternion fromRotation = Quaternion.Euler(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, 0); Quaternion toRotation = Quaternion.Euler(rotationXAxis, rotationYAxis, 0); Quaternion rotation = toRotation; distance = Mathf.Clamp(distance - GetZoomAmount(), distanceMin, distanceMax); // RaycastHit hit; // if (Physics.Linecast(target.position, transform.position, out hit)) // { // distance -= hit.distance; // } Vector3 negDistance = new Vector3(0.0f, 0.0f, -distance); Vector3 position = rotation * negDistance + target.position; transform.rotation = rotation; transform.position = position; velocityX = Mathf.Lerp(velocityX, 0, Time.deltaTime * smoothTime); velocityY = Mathf.Lerp(velocityY, 0, Time.deltaTime * smoothTime); } } private float GetZoomAmount() { // If this is a handheld, use pinch to zoom if (SystemInfo.deviceType == DeviceType.Handheld) { // If there are two touches on the device... if (Input.touchCount == 2) { // Store both touches. Touch touchZero = Input.GetTouch(0); Touch touchOne = Input.GetTouch(1); // Find the position in the previous frame of each touch. Vector2 touchZeroPrevPos = touchZero.position - touchZero.deltaPosition; Vector2 touchOnePrevPos = touchOne.position - touchOne.deltaPosition; // Find the magnitude of the vector (the distance) between the touches in each frame. float prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude; float touchDeltaMag = (touchZero.position - touchOne.position).magnitude; // Find the difference in the distances between each frame. return - (prevTouchDeltaMag - touchDeltaMag) * zoomSpeedMobile; } else { return 0; } } else { // Otherwise, we use the scrollwheel for zooming return Input.GetAxis("Mouse ScrollWheel") * zoomSpeedDesktop; } } public static float ClampAngle(float angle, float min, float max) { if (angle < -360F) angle += 360F; if (angle > 360F) angle -= 360F; return Mathf.Clamp(angle, min, max); } }