using DG.Tweening; using UnityEngine; public class AquariumCameraMove : MonoBehaviour { int layerMask; //屏幕拖动比例 float dragCameraScale = 0.03f; private Vector3 initialRotation; Vector3 _curMousePos; Vector3 _offsetEuler; Quaternion targetRotation; Vector2 cameraOffset; Quaternion startRot; float duration = 0.65f; FishingAquariumAct fishingAquariumAct; GameObject curClick; private void Awake() { layerMask = 1 << LayerMask.NameToLayer("fish"); startRot = transform.rotation; } public void Init(Vector2 cameraOffset, FishingAquariumAct fishingAquariumAct) { this.fishingAquariumAct = fishingAquariumAct; this.cameraOffset = cameraOffset; } float CheckAngle(float value) { float angle = value - 180; if (angle > 0) return angle - 180; return angle + 180; } private void LateUpdate() { if (Input.GetMouseButtonDown(0) && fishingAquariumAct.CanDragMove()) { transform.DOKill(); _curMousePos = Input.mousePosition; _offsetEuler = Vector3.zero; initialRotation = transform.rotation.eulerAngles; initialRotation.x = CheckAngle(initialRotation.x); initialRotation.y = CheckAngle(initialRotation.y); targetRotation = transform.rotation; curClick = SelectTarget(); } else if (Input.GetMouseButton(0) && fishingAquariumAct.CanDragMove()) { Vector3 ver = Input.mousePosition - _curMousePos; if (ver.magnitude > 5) { _offsetEuler.x -= ver.y * dragCameraScale; _offsetEuler.y += ver.x * dragCameraScale; var targetEulerAngles = initialRotation + _offsetEuler; // Clamp the rotation angles targetEulerAngles.x = Mathf.Clamp(targetEulerAngles.x, -cameraOffset.x, cameraOffset.x); targetEulerAngles.y = Mathf.Clamp(targetEulerAngles.y, -cameraOffset.y, cameraOffset.y); targetEulerAngles.z = 0; _offsetEuler = targetEulerAngles - initialRotation; targetRotation = Quaternion.Euler(targetEulerAngles); //transform.rotation = targetRotation; _curMousePos = Input.mousePosition; } transform.rotation = Quaternion.Angle(targetRotation, transform.rotation) > 0.1f ? Quaternion.Lerp(transform.rotation, targetRotation, 0.2f) : targetRotation; } else if (Input.GetMouseButtonUp(0)) { transform.DORotateQuaternion(startRot, duration); GameObject localClick = SelectTarget(); if (localClick != null && localClick == curClick) { var fish = curClick.GetComponentInParent(); fishingAquariumAct.OnClickFish(fish.slotData.index); curClick = null; } } } private GameObject SelectTarget() { var ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out var hit, 100, layerMask)) { //Debug.Log($"hit: {hit.collider.gameObject.layer}"); //if (hit.collider.gameObject.layer == layerMask) //{ //Debug.Log($"hit position: {hit.point}"); return hit.collider.gameObject; //} } return null; } }