Files
3d-bianpo/Assets/Scripts/ControlMoveWithCollider.cs
2026-03-03 11:30:53 +08:00

175 lines
6.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<Rigidbody>();
cam = Camera.main;
Vector3 core = inScript.core;
if (inScript == null)
Debug.LogError("<22><><EFBFBD><EFBFBD> Inspector <20>аѹ<D0B0><D1B9><EFBFBD> ClickToFocus <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> inScript");
}
void Update()
{
//if (SliderDragDetector.isSliderDragging)
// return;
if (inScript == null) return;
Vector3 core = inScript.core;
// <20><><EFBFBD><EFBFBD> <20>Ҽ<EFBFBD>ƽ<EFBFBD><C6BD> <20><><EFBFBD><EFBFBD>
if (Input.GetMouseButton(1))
{
moveSpeed = Vector3.Distance(core, transform.position) / 2f;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BCB0><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD>ʵ<EFBFBD>ʿռ<CABF><D5BC>׵Ĺ<D7B5>ϵת<CFB5><D7AA>
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;
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD><EFB7A2><EFBFBD><EFBFBD>ײ
if (!WillCollideWithObstacle(desiredPosition))
{
cam.transform.position = desiredPosition;
}
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
float scroll = Input.GetAxis("Mouse ScrollWheel");
if (Mathf.Abs(scroll) > 0.001f)
{
Vector3 desiredPosition = cam.transform.position + cam.transform.forward * scroll * zoomSpeed;
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD><EFB7A2><EFBFBD><EFBFBD>ײ
if (!WillCollideWithObstacle(desiredPosition))
{
cam.transform.position = desiredPosition;
}
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʼ/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת <20><><EFBFBD><EFBFBD>
if (Input.GetMouseButtonDown(0))
{
isRotating = true;
lastMousePos = Input.mousePosition;
}
if (Input.GetMouseButtonUp(0))
{
isRotating = false;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ק<EFBFBD><D7A7>RotateAround ʵ<><CAB5> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (isRotating && Input.GetMouseButton(0))
{
Vector2 curr = Input.mousePosition;
Vector2 delta = (curr - lastMousePos) * rotationSensitivity;
lastMousePos = curr;
/*
*/
// 1. ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Y <20><><EFBFBD><EFBFBD>ת
//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;
// <20><><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ײ
if (!WillCollideWithObstacle(newPosHorizonal))
{
// <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ײ<EFBFBD><D7B2>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD>ת
cam.transform.RotateAround(core, Vector3.up, delta.x);
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD>ˣ<EFBFBD><CBA3>Ͳ<EFBFBD><CDB2><EFBFBD>
}
// 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת
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);
}
}
}
}
// <20><>ײ<EFBFBD><D7B2><EFBFBD><E2B7BD>
bool WillCollideWithObstacle(Vector3 targetPosition)
{
// <20><><EFBFBD><EFBFBD>ӵ<EFBFBD>ǰλ<C7B0>õ<EFBFBD>Ŀ<EFBFBD><C4BF>λ<EFBFBD>õķ<C3B5><C4B7><EFBFBD>;<EFBFBD><CDBE><EFBFBD>
Vector3 moveDir = targetPosition - cam.transform.position;
float moveDist = moveDir.magnitude;
// ʹ<><CAB9> SphereCast <20><><EFBFBD><E9BCB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD><EFB7A2><EFBFBD><EFBFBD>ײ
RaycastHit hit;
if (Physics.SphereCast(cam.transform.position, 0.5f, moveDir, out hit, moveDist, LayerMask.GetMask("Default"), QueryTriggerInteraction.Collide) )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2B5BD>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> true
Debug.Log("collider");
return true;
}
else if ( Mathf.Pow(targetPosition.x+120f, 2f)+ Mathf.Pow(targetPosition.z , 2f)<10000f && targetPosition.y<80f)
{
// <20><><EFBFBD><EFBFBD>ڷ<EFBFBD>Χ<EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD> false
return false;
}
else
Debug.Log("outRange");
return true;//<2F><><EFBFBD>true<75><65>Ϊ<EFBFBD><CEAA><EFBFBD>з<EFBFBD><D0B7><EFBFBD>ֵ<EFBFBD><D6B5>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>߲<EFBFBD><DFB2><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
}
}