| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 | using UnityEngine;using System.Collections;namespace TMPro.Examples{        public class CameraController : MonoBehaviour    {        public enum CameraModes { Follow, Isometric, Free }        private Transform cameraTransform;        private Transform dummyTarget;        public Transform CameraTarget;        public float FollowDistance = 30.0f;        public float MaxFollowDistance = 100.0f;        public float MinFollowDistance = 2.0f;        public float ElevationAngle = 30.0f;        public float MaxElevationAngle = 85.0f;        public float MinElevationAngle = 0f;        public float OrbitalAngle = 0f;        public CameraModes CameraMode = CameraModes.Follow;        public bool MovementSmoothing = true;        public bool RotationSmoothing = false;        private bool previousSmoothing;        public float MovementSmoothingValue = 25f;        public float RotationSmoothingValue = 5.0f;        public float MoveSensitivity = 2.0f;        private Vector3 currentVelocity = Vector3.zero;        private Vector3 desiredPosition;        private float mouseX;        private float mouseY;        private Vector3 moveVector;        private float mouseWheel;        // Controls for Touches on Mobile devices        //private float prev_ZoomDelta;        private const string event_SmoothingValue = "Slider - Smoothing Value";        private const string event_FollowDistance = "Slider - Camera Zoom";        void Awake()        {            if (QualitySettings.vSyncCount > 0)                Application.targetFrameRate = 60;            else                Application.targetFrameRate = -1;            if (Application.platform == RuntimePlatform.IPhonePlayer || Application.platform == RuntimePlatform.Android)                Input.simulateMouseWithTouches = false;            cameraTransform = transform;            previousSmoothing = MovementSmoothing;        }        // Use this for initialization        void Start()        {            if (CameraTarget == null)            {                // If we don't have a target (assigned by the player, create a dummy in the center of the scene).                dummyTarget = new GameObject("Camera Target").transform;                CameraTarget = dummyTarget;            }        }        // Update is called once per frame        void LateUpdate()        {            GetPlayerInput();            // Check if we still have a valid target            if (CameraTarget != null)            {                if (CameraMode == CameraModes.Isometric)                {                    desiredPosition = CameraTarget.position + Quaternion.Euler(ElevationAngle, OrbitalAngle, 0f) * new Vector3(0, 0, -FollowDistance);                }                else if (CameraMode == CameraModes.Follow)                {                    desiredPosition = CameraTarget.position + CameraTarget.TransformDirection(Quaternion.Euler(ElevationAngle, OrbitalAngle, 0f) * (new Vector3(0, 0, -FollowDistance)));                }                else                {                    // Free Camera implementation                }                if (MovementSmoothing == true)                {                    // Using Smoothing                    cameraTransform.position = Vector3.SmoothDamp(cameraTransform.position, desiredPosition, ref currentVelocity, MovementSmoothingValue * Time.fixedDeltaTime);                    //cameraTransform.position = Vector3.Lerp(cameraTransform.position, desiredPosition, Time.deltaTime * 5.0f);                }                else                {                    // Not using Smoothing                    cameraTransform.position = desiredPosition;                }                if (RotationSmoothing == true)                    cameraTransform.rotation = Quaternion.Lerp(cameraTransform.rotation, Quaternion.LookRotation(CameraTarget.position - cameraTransform.position), RotationSmoothingValue * Time.deltaTime);                else                {                    cameraTransform.LookAt(CameraTarget);                }            }        }        void GetPlayerInput()        {            moveVector = Vector3.zero;            // Check Mouse Wheel Input prior to Shift Key so we can apply multiplier on Shift for Scrolling            mouseWheel = Input.GetAxis("Mouse ScrollWheel");            float touchCount = Input.touchCount;            if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift) || touchCount > 0)            {                mouseWheel *= 10;                if (Input.GetKeyDown(KeyCode.I))                    CameraMode = CameraModes.Isometric;                if (Input.GetKeyDown(KeyCode.F))                    CameraMode = CameraModes.Follow;                if (Input.GetKeyDown(KeyCode.S))                    MovementSmoothing = !MovementSmoothing;                // Check for right mouse button to change camera follow and elevation angle                if (Input.GetMouseButton(1))                {                    mouseY = Input.GetAxis("Mouse Y");                    mouseX = Input.GetAxis("Mouse X");                    if (mouseY > 0.01f || mouseY < -0.01f)                    {                        ElevationAngle -= mouseY * MoveSensitivity;                        // Limit Elevation angle between min & max values.                        ElevationAngle = Mathf.Clamp(ElevationAngle, MinElevationAngle, MaxElevationAngle);                    }                    if (mouseX > 0.01f || mouseX < -0.01f)                    {                        OrbitalAngle += mouseX * MoveSensitivity;                        if (OrbitalAngle > 360)                            OrbitalAngle -= 360;                        if (OrbitalAngle < 0)                            OrbitalAngle += 360;                    }                }                // Get Input from Mobile Device                if (touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved)                {                    Vector2 deltaPosition = Input.GetTouch(0).deltaPosition;                    // Handle elevation changes                    if (deltaPosition.y > 0.01f || deltaPosition.y < -0.01f)                    {                        ElevationAngle -= deltaPosition.y * 0.1f;                        // Limit Elevation angle between min & max values.                        ElevationAngle = Mathf.Clamp(ElevationAngle, MinElevationAngle, MaxElevationAngle);                    }                    // Handle left & right                     if (deltaPosition.x > 0.01f || deltaPosition.x < -0.01f)                    {                        OrbitalAngle += deltaPosition.x * 0.1f;                        if (OrbitalAngle > 360)                            OrbitalAngle -= 360;                        if (OrbitalAngle < 0)                            OrbitalAngle += 360;                    }                }                // Check for left mouse button to select a new CameraTarget or to reset Follow position                if (Input.GetMouseButton(0))                {                    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);                    RaycastHit hit;                    if (Physics.Raycast(ray, out hit, 300, 1 << 10 | 1 << 11 | 1 << 12 | 1 << 14))                    {                        if (hit.transform == CameraTarget)                        {                            // Reset Follow Position                            OrbitalAngle = 0;                        }                        else                        {                            CameraTarget = hit.transform;                            OrbitalAngle = 0;                            MovementSmoothing = previousSmoothing;                        }                    }                }                if (Input.GetMouseButton(2))                {                    if (dummyTarget == null)                    {                        // We need a Dummy Target to anchor the Camera                        dummyTarget = new GameObject("Camera Target").transform;                        dummyTarget.position = CameraTarget.position;                        dummyTarget.rotation = CameraTarget.rotation;                        CameraTarget = dummyTarget;                        previousSmoothing = MovementSmoothing;                        MovementSmoothing = false;                    }                    else if (dummyTarget != CameraTarget)                    {                        // Move DummyTarget to CameraTarget                        dummyTarget.position = CameraTarget.position;                        dummyTarget.rotation = CameraTarget.rotation;                        CameraTarget = dummyTarget;                        previousSmoothing = MovementSmoothing;                        MovementSmoothing = false;                    }                    mouseY = Input.GetAxis("Mouse Y");                    mouseX = Input.GetAxis("Mouse X");                    moveVector = cameraTransform.TransformDirection(mouseX, mouseY, 0);                    dummyTarget.Translate(-moveVector, Space.World);                }            }            // Check Pinching to Zoom in - out on Mobile device            if (touchCount == 2)            {                Touch touch0 = Input.GetTouch(0);                Touch touch1 = Input.GetTouch(1);                Vector2 touch0PrevPos = touch0.position - touch0.deltaPosition;                Vector2 touch1PrevPos = touch1.position - touch1.deltaPosition;                float prevTouchDelta = (touch0PrevPos - touch1PrevPos).magnitude;                float touchDelta = (touch0.position - touch1.position).magnitude;                float zoomDelta = prevTouchDelta - touchDelta;                if (zoomDelta > 0.01f || zoomDelta < -0.01f)                {                    FollowDistance += zoomDelta * 0.25f;                    // Limit FollowDistance between min & max values.                    FollowDistance = Mathf.Clamp(FollowDistance, MinFollowDistance, MaxFollowDistance);                }            }            // Check MouseWheel to Zoom in-out            if (mouseWheel < -0.01f || mouseWheel > 0.01f)            {                FollowDistance -= mouseWheel * 5.0f;                // Limit FollowDistance between min & max values.                FollowDistance = Mathf.Clamp(FollowDistance, MinFollowDistance, MaxFollowDistance);            }        }    }}
 |