using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using UnityEngine.EventSystems; public class RotateRound : MonoBehaviour, IPointerDownHandler,IDragHandler,IPointerUpHandler,IPointerEnterHandler,IPointerExitHandler { public Transform _camera; public Transform target; private Vector2 mouseClickPos = Vector2.zero; private Vector2 mouseLastPos = Vector2.zero; private Vector3 cameraPos; private float _viewDistance; float speed = 15f; int roteDir = 0; public bool mouseWheelOpen = false; // Start is called before the first frame update void Start() { cameraPos.x = _camera.localPosition.x; cameraPos.y = _camera.localPosition.y; cameraPos.z = _camera.localPosition.z; } private void Update() { if (mouseWheelOpen) { //鼠标滚轮控制远近 if (Input.GetAxis("Mouse ScrollWheel") != 0) { _viewDistance = Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime * 100f*50; _viewDistance = Mathf.Clamp(_viewDistance, -100, 100); cameraPos =_camera.localPosition+ _camera.forward.normalized * _viewDistance; _camera.localPosition = cameraPos; } } } public void OnPointerDown(PointerEventData eventData) { mouseClickPos = Input.mousePosition; mouseLastPos = mouseClickPos; } public void OnDrag(PointerEventData eventData) { //鼠标左键控制左右,上下轴旋转 if (Input.GetMouseButton(0)) { Vector2 TempMousePos = Input.mousePosition; float x_Rote = TempMousePos.x - mouseClickPos.x; float y_Rote = TempMousePos.y - mouseClickPos.y; if (Mathf.Abs(x_Rote) > 5f&&roteDir==0) { //方向锁 roteDir = 1; }else if (Mathf.Abs(y_Rote) > 5f && roteDir == 0) { //方向锁 roteDir = 2; } switch (roteDir) { case 1: x_Rote = TempMousePos.x - mouseLastPos.x; _camera.transform.RotateAround(target.position, Vector3.up, x_Rote * speed * Time.deltaTime); mouseLastPos.x = TempMousePos.x; break; case 2: y_Rote = TempMousePos.y - mouseLastPos.y; _camera.transform.RotateAround(target.position, Vector3.right, y_Rote * speed * Time.deltaTime); mouseLastPos.y = TempMousePos.y; break; } } //鼠标滚轮平移视角 if (Input.GetMouseButton(2)) { Vector2 TempMousePos = Input.mousePosition; float x_move = TempMousePos.x - mouseClickPos.x; float y_move = TempMousePos.y - mouseClickPos.y; if(Mathf.Abs(x_move)>2f|| Mathf.Abs(y_move) > 2f) { x_move = TempMousePos.x - mouseLastPos.x; y_move = TempMousePos.y - mouseLastPos.y; _camera.transform.localPosition += new Vector3(x_move * Time.deltaTime * speed*3, -y_move * Time.deltaTime * speed*3, 0); mouseLastPos.x = TempMousePos.x; mouseLastPos.y = TempMousePos.y; } } } public void OnPointerUp(PointerEventData eventData) { mouseClickPos = Vector2.zero; mouseLastPos = Vector2.zero; roteDir = 0; } public void OnPointerEnter(PointerEventData eventData) { mouseWheelOpen = true; } public void OnPointerExit(PointerEventData eventData) { mouseWheelOpen = false; } }