滑鼠縮放拖動物體
阿新 • • 發佈:2019-01-10
using UnityEngine; /// <summary> /// 指令碼掛載新建相機上 —— /// </summary> public class ChinarSmoothUi3DCamera : MonoBehaviour { public Transform pivot; public Vector3 pivotOffset = Vector3.zero; public Transform target; public float distance = 10.0f; public float minDistance = 2f; public float maxDistance = 15f; public float zoomSpeed = 1f; public float xSpeed = 250.0f; public float ySpeed = 250.0f; public bool allowYTilt = true; public float yMinLimit = -90f; public float yMaxLimit = 90f; private float x = 0.0f; private float y = 0.0f; private float targetX = 0f; private float targetY = 0f; public float targetDistance = 0f; private float xVelocity = 1f; private float yVelocity = 1f; private float zoomVelocity = 1f; private void Start() { var angles = transform.eulerAngles; targetX = x = angles.x; targetY = y = ClampAngle(angles.y, yMinLimit, yMaxLimit); targetDistance = distance; } private void LateUpdate() { if (!pivot) return; var scroll = Input.GetAxis("Mouse ScrollWheel"); if (scroll > 0.0f) targetDistance -= zoomSpeed; else if (scroll < 0.0f) targetDistance += zoomSpeed; targetDistance = Mathf.Clamp(targetDistance, minDistance, maxDistance); if (Input.GetMouseButton(1) || (Input.GetMouseButton(0) && (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl)))) { targetX += Input.GetAxis("Mouse X") * xSpeed * 0.02f; if (allowYTilt) { targetY -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f; targetY = ClampAngle(targetY, yMinLimit, yMaxLimit); } } x = Mathf.SmoothDampAngle(x, targetX, ref xVelocity, 0.3f); y = allowYTilt ? Mathf.SmoothDampAngle(y, targetY, ref yVelocity, 0.3f) : targetY; Quaternion rotation = Quaternion.Euler(y, x, 0);//水平移動相當於繞Y軸,垂直移動相當於繞X軸,所以要置換 distance = Mathf.SmoothDamp(distance, targetDistance, ref zoomVelocity, 0.5f); Vector3 position = rotation * new Vector3(0.0f, 0.0f, -distance) + pivot.position + pivotOffset; transform.rotation = rotation; transform.position = position; } private 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); } }