using UnityEngine; using UnityEngine.EventSystems; public class MouseFollowRotation : MonoBehaviour { public Transform target; public float xSpeed = 200; public float ySpeed = 200; public float mSpeed = 10; public float moveSpeed = 30f; public float dragPanSpeed = 1f; public float yMinLimit = -50; public float yMaxLimit = 50; public float xPosMinLimit = -20; public float xPosMaxLimit = 20; public float zPosMinLimit = -20; public float zPosMaxLimit = 20; public float distance = 2; public float minDistance = 2; public float maxDistance = 30; private bool dragPanMoveActive; private Vector2 lastMousePosition; public bool OnUI = false; public bool OnOffUI = false; public bool move = false; public bool needDamping = false; float damping = 5.0f; public float x = 0.0f; public float y = 0.0f; // Use this for initialization void Start() { Vector3 angles = transform.eulerAngles; x = angles.y; y = angles.x; } // Update is called once per frame void LateUpdate() { onoffUI(); /* if (EventSystem.current.IsPointerOverGameObject()) { OnUI = true; } else { OnUI = false; if (move == true) { MovementView(); } Rotate(); }*/ } void onoffUI() { if (EventSystem.current.IsPointerOverGameObject() && OnOffUI) { OnUI = true; } else { OnUI = false; if (move == true) { MovementView(); } Rotate(); } } void Rotate() { if (target) { //use the light button of mouse to rotate the camera if (Input.GetMouseButton(1)) { x += Input.GetAxis("Mouse X") * xSpeed * 0.02f; y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f; y = ClampAngle(y, yMinLimit, yMaxLimit); } distance -= Input.GetAxis("Mouse ScrollWheel") * mSpeed; distance = Mathf.Clamp(distance, minDistance, maxDistance); Quaternion rotation = Quaternion.Euler(y, x, 0.0f); Vector3 disVector = new Vector3(0.0f, 0.0f, -distance); Vector3 position = rotation * disVector + target.position; //adjust the camera if (needDamping) { transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * damping); transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * damping); } else { transform.rotation = rotation; transform.position = position; target.rotation = rotation; } } } void MovementView() { Vector3 inputDir = new Vector3(0, 0, 0); if (Input.GetMouseButtonDown(0)) { dragPanMoveActive = true; lastMousePosition = Input.mousePosition; } if (Input.GetMouseButtonUp(0)) { dragPanMoveActive = false; } if (dragPanMoveActive) { Vector2 mouseMovementDelta = (Vector2)Input.mousePosition - lastMousePosition; // float dragPanSpeed = 1f; inputDir.x = mouseMovementDelta.x * dragPanSpeed; inputDir.z = mouseMovementDelta.y * dragPanSpeed; lastMousePosition = Input.mousePosition; } Vector3 moveDir = target.forward * -inputDir.z + target.right * -inputDir.x; target.position += moveDir * moveSpeed * Time.deltaTime; target.position = new Vector3(Mathf.Clamp(target.position.x, xPosMinLimit, xPosMaxLimit), 0, Mathf.Clamp(target.position.z, zPosMinLimit, zPosMaxLimit)); } static float ClampAngle(float angle, float min, float max) { if (angle < -360) angle += 360; if (angle > 360) angle -= 360; return Mathf.Clamp(angle, min, max); } }