fix:代码提交

This commit is contained in:
zhangjiajia
2026-03-03 11:30:53 +08:00
parent adf60cc8df
commit 21ebd4c951
2520 changed files with 178964 additions and 0 deletions

View File

@@ -0,0 +1,174 @@
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>
}
}