风速风向动画
This commit is contained in:
@@ -2,12 +2,13 @@ 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; // 最大俯仰角度(向上旋转的极限)
|
||||
public float moveSpeed = 50f; // 右键平移速度
|
||||
public float zoomSpeed = 10f; // 滚轮缩放速度
|
||||
public ClickToFocus inScript; // 引用焦点脚本,提供 core
|
||||
public float rotationSensitivity = 0.2f; // 左键拖拽旋转灵敏度
|
||||
//public float minPitch = -8f; // 最低俯仰角
|
||||
//public float maxPitch = 80f; // 最高俯仰角
|
||||
|
||||
private Camera cam;
|
||||
private bool isRotating = false;
|
||||
private Vector2 lastMousePos;
|
||||
@@ -20,7 +21,7 @@ public class ControlMoveWithCollider : MonoBehaviour
|
||||
cam = Camera.main;
|
||||
Vector3 core = inScript.core;
|
||||
if (inScript == null)
|
||||
Debug.LogError("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Inspector <EFBFBD>аѹ<EFBFBD><EFBFBD><EFBFBD> ClickToFocus <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> inScript");
|
||||
Debug.LogError("请在 Inspector 中把挂有 ClickToFocus 的物体拖给 inScript");
|
||||
}
|
||||
|
||||
void Update()
|
||||
@@ -30,35 +31,35 @@ public class ControlMoveWithCollider : MonoBehaviour
|
||||
if (inScript == null) return;
|
||||
Vector3 core = inScript.core;
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҽ<EFBFBD>ƽ<EFBFBD><C6BD> <20><><EFBFBD><EFBFBD>
|
||||
// —— 右键平移 ——
|
||||
if (Input.GetMouseButton(1))
|
||||
{
|
||||
moveSpeed = Vector3.Distance(core, transform.position) / 2f;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>漰<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD>ʵ<EFBFBD>ʿռ<EFBFBD><EFBFBD>Ĺ<EFBFBD>ϵת<EFBFBD><EFBFBD>
|
||||
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;
|
||||
|
||||
// <EFBFBD>ж<EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ
|
||||
// 判断是否与障碍物发生碰撞
|
||||
if (!WillCollideWithObstacle(desiredPosition))
|
||||
{
|
||||
cam.transform.position = desiredPosition;
|
||||
}
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><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;
|
||||
|
||||
// <EFBFBD>ж<EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ
|
||||
// 判断是否与障碍物发生碰撞
|
||||
if (!WillCollideWithObstacle(desiredPosition))
|
||||
{
|
||||
cam.transform.position = desiredPosition;
|
||||
}
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʼ/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת <20><><EFBFBD><EFBFBD>
|
||||
// —— 左键开始/结束旋转 ——
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
isRotating = true;
|
||||
@@ -69,7 +70,7 @@ public class ControlMoveWithCollider : MonoBehaviour
|
||||
isRotating = false;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ק<EFBFBD><D7A7>RotateAround ʵ<><CAB5> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// —— 左键拖拽:RotateAround 实现 + 俯仰限制 ——
|
||||
if (isRotating && Input.GetMouseButton(0))
|
||||
{
|
||||
Vector2 curr = Input.mousePosition;
|
||||
@@ -79,7 +80,7 @@ public class ControlMoveWithCollider : MonoBehaviour
|
||||
/*
|
||||
|
||||
*/
|
||||
// 1. ˮƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Y <20><><EFBFBD><EFBFBD>ת
|
||||
// 1. 水平绕世界 Y 轴旋转
|
||||
//Vector3 desiredPosition = cam.transform.position;
|
||||
//cam.transform.RotateAround(core, Vector3.up, delta.x);
|
||||
|
||||
@@ -89,19 +90,19 @@ public class ControlMoveWithCollider : MonoBehaviour
|
||||
Vector3 newPosHorizonal = core + newLocalPosHorizonal;
|
||||
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ
|
||||
// 检查旋转后是否发生碰撞
|
||||
if (!WillCollideWithObstacle(newPosHorizonal))
|
||||
{
|
||||
// <EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת
|
||||
// 如果没有碰撞,执行旋转
|
||||
cam.transform.RotateAround(core, Vector3.up, delta.x);
|
||||
}
|
||||
else
|
||||
{
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD>ˣ<EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD>
|
||||
// 如果碰撞了,就不动
|
||||
|
||||
}
|
||||
|
||||
// 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת
|
||||
// 2. 俯仰旋转
|
||||
Vector3 dir = (cam.transform.position - core).normalized;
|
||||
Vector3 flat = new Vector3(dir.x, 0f, dir.z).normalized;
|
||||
float selfFlatX = cam.transform.forward.x;
|
||||
@@ -146,29 +147,29 @@ public class ControlMoveWithCollider : MonoBehaviour
|
||||
}
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD>ײ<EFBFBD><EFBFBD>ⷽ<EFBFBD><EFBFBD>
|
||||
// 碰撞检测方法
|
||||
bool WillCollideWithObstacle(Vector3 targetPosition)
|
||||
{
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ǰλ<EFBFBD>õ<EFBFBD>Ŀ<EFBFBD><EFBFBD>λ<EFBFBD>õķ<EFBFBD><EFBFBD><EFBFBD>;<EFBFBD><EFBFBD><EFBFBD>
|
||||
// 计算从当前位置到目标位置的方向和距离
|
||||
Vector3 moveDir = targetPosition - cam.transform.position;
|
||||
float moveDist = moveDir.magnitude;
|
||||
|
||||
// ʹ<EFBFBD><EFBFBD> SphereCast <EFBFBD><EFBFBD>鼴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ
|
||||
// 使用 SphereCast 检查即将到达的位置是否会与障碍物发生碰撞
|
||||
RaycastHit hit;
|
||||
if (Physics.SphereCast(cam.transform.position, 0.5f, moveDir, out hit, moveDist, LayerMask.GetMask("Default"), QueryTriggerInteraction.Collide) )
|
||||
{
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> true
|
||||
// 如果检测到碰撞,返回 true
|
||||
Debug.Log("collider");
|
||||
return true;
|
||||
}
|
||||
else if ( Mathf.Pow(targetPosition.x+120f, 2f)+ Mathf.Pow(targetPosition.z , 2f)<10000f && targetPosition.y<80f)
|
||||
{
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD>Χ<EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> false
|
||||
// 如果在范围内,返回 false
|
||||
return false;
|
||||
}
|
||||
else
|
||||
Debug.Log("outRange");
|
||||
return true;//<EFBFBD><EFBFBD><EFBFBD>true<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
|
||||
return true;//这个true是为了有返回值,实际上走不到这一步
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user