using UnityEngine; public class ControlMoveWithCollider : MonoBehaviour { public float moveSpeed = 50f; // 相机平移速度 public float zoomSpeed = 10f; // 相机缩放速度 public ClickToFocus inScript; // 点击聚焦的脚本,提供核心逻辑 public float rotationSensitivity = 0.2f; // 鼠标控制旋转的灵敏度 //public float minPitch = -8f; // 最小俯仰角度(向下旋转的极限) //public float maxPitch = 80f; // 最大俯仰角度(向上旋转的极限) private Camera cam; private bool isRotating = false; private Vector2 lastMousePos; private Vector3 reservoirCenter = new Vector3(1551f, 25f, 1119f); private Rigidbody rb; void Start() { rb = GetComponent(); cam = Camera.main; Vector3 core = inScript.core; if (inScript == null) Debug.LogError("���� Inspector �аѹ��� ClickToFocus �������ϸ� inScript"); } void Update() { //if (SliderDragDetector.isSliderDragging) // return; if (inScript == null) return; Vector3 core = inScript.core; // ���� �Ҽ�ƽ�� ���� if (Input.GetMouseButton(1)) { moveSpeed = Vector3.Distance(core, transform.position) / 2f;//�����漰�����غ�ʵ�ʿռ��׵Ĺ�ϵת�� float mx = Input.GetAxis("Mouse X"); float my = Input.GetAxis("Mouse Y"); Vector3 desiredPosition = cam.transform.position + (-cam.transform.right * mx + -cam.transform.up * my) * moveSpeed * Time.deltaTime; // �ж��Ƿ����ϰ��﷢����ײ if (!WillCollideWithObstacle(desiredPosition)) { cam.transform.position = desiredPosition; } } // ���� �������� ���� float scroll = Input.GetAxis("Mouse ScrollWheel"); if (Mathf.Abs(scroll) > 0.001f) { Vector3 desiredPosition = cam.transform.position + cam.transform.forward * scroll * zoomSpeed; // �ж��Ƿ����ϰ��﷢����ײ if (!WillCollideWithObstacle(desiredPosition)) { cam.transform.position = desiredPosition; } } // ���� �����ʼ/������ת ���� if (Input.GetMouseButtonDown(0)) { isRotating = true; lastMousePos = Input.mousePosition; } if (Input.GetMouseButtonUp(0)) { isRotating = false; } // ���� �����ק��RotateAround ʵ�� + �������� ���� if (isRotating && Input.GetMouseButton(0)) { Vector2 curr = Input.mousePosition; Vector2 delta = (curr - lastMousePos) * rotationSensitivity; lastMousePos = curr; /* */ // 1. ˮƽ������ Y ����ת //Vector3 desiredPosition = cam.transform.position; //cam.transform.RotateAround(core, Vector3.up, delta.x); Vector3 localPosHorizonal = cam.transform.position - core; Quaternion rotationHorizonal = Quaternion.AngleAxis(delta.x, Vector3.up); Vector3 newLocalPosHorizonal = rotationHorizonal * localPosHorizonal; Vector3 newPosHorizonal = core + newLocalPosHorizonal; // �����ת���Ƿ�����ײ if (!WillCollideWithObstacle(newPosHorizonal)) { // ���û����ײ��ִ����ת cam.transform.RotateAround(core, Vector3.up, delta.x); } else { // �����ײ�ˣ��Ͳ��� } // 2. ������ת Vector3 dir = (cam.transform.position - core).normalized; Vector3 flat = new Vector3(dir.x, 0f, dir.z).normalized; float selfFlatX = cam.transform.forward.x; float selfFlatZ = cam.transform.forward.z; Vector3 selfFlat = new Vector3(selfFlatX, 0f, selfFlatZ).normalized; float selfPitch = Vector3.SignedAngle(selfFlat, cam.transform.forward, cam.transform.right); if (selfPitch <= 80f && selfPitch >= 0f) { float pitchDelta = delta.y * -1f; Vector3 localPosVertical = cam.transform.position - core; Quaternion rotationVertical = Quaternion.AngleAxis(pitchDelta, cam.transform.right); Vector3 newPosVertical = core + rotationVertical * localPosVertical; if (!WillCollideWithObstacle(newPosVertical)) { cam.transform.RotateAround(core, cam.transform.right, pitchDelta); } } else if (selfPitch > 80f) { float pitchDelta = delta.y * -1f; if (pitchDelta < 0f) { cam.transform.RotateAround(core, cam.transform.right, pitchDelta); } } else if (selfPitch < 0f) { float pitchDelta = delta.y * -1f; if (pitchDelta > 0f) { cam.transform.RotateAround(core, cam.transform.right, pitchDelta); } } } } // ��ײ��ⷽ�� bool WillCollideWithObstacle(Vector3 targetPosition) { // ����ӵ�ǰλ�õ�Ŀ��λ�õķ���;��� Vector3 moveDir = targetPosition - cam.transform.position; float moveDist = moveDir.magnitude; // ʹ�� SphereCast ��鼴�������λ���Ƿ�����ϰ��﷢����ײ RaycastHit hit; if (Physics.SphereCast(cam.transform.position, 0.5f, moveDir, out hit, moveDist, LayerMask.GetMask("Default"), QueryTriggerInteraction.Collide) ) { // �����⵽��ײ������ true Debug.Log("collider"); return true; } else if ( Mathf.Pow(targetPosition.x+120f, 2f)+ Mathf.Pow(targetPosition.z , 2f)<10000f && targetPosition.y<80f) { // ����ڷ�Χ�ڣ����� false return false; } else Debug.Log("outRange"); return true;//���true��Ϊ���з���ֵ��ʵ�����߲�����һ�� } }