根据提供的code differences信息,由于没有具体的代码变更内容,我将生成一个通用的commit message模板:
``` docs(readme): 更新文档说明 - 添加项目使用指南 - 完善API接口说明 - 修正错误的配置示例 ```
This commit is contained in:
1 parent
a74d1e62d7
commit
8d58c2223c
167 files changed
+1119
-15679
No files matched your search
@@ -0,0 +1,145 @@
|
||||
using UnityEngine;
|
||||
|
||||
public class CameraFollow : MonoBehaviour
|
||||
{
|
||||
[Header("拖动控制")]
|
||||
public float keyboardDragSpeed = 10f; // WASD拖动速度(模拟手指拖动屏幕)
|
||||
public float mouseDragSpeed = 0.5f; // 鼠标拖动速度
|
||||
public float touchDragSpeed = 0.5f; // 触摸拖动速度
|
||||
|
||||
[Header("缩放控制(正交相机用orthographicSize,透视相机用fieldOfView)")]
|
||||
public float zoomSpeed = 5f; // 缩放速度
|
||||
public float minOrthographicSize = 5f; // 正交相机最小size
|
||||
public float maxOrthographicSize = 20f; // 正交相机最大size
|
||||
public float minFieldOfView = 30f; // 透视相机最小FOV
|
||||
public float maxFieldOfView = 90f; // 透视相机最大FOV
|
||||
|
||||
[Header("边界限制")]
|
||||
public bool enableBounds = true;
|
||||
public float minX = -6f;
|
||||
public float maxX = 6f;
|
||||
public float minZ = -30f;
|
||||
public float maxZ = 91f;
|
||||
|
||||
private Vector3 lastMousePosition;
|
||||
private bool isDragging = false;
|
||||
private Camera cam;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
cam = GetComponent<Camera>();
|
||||
if (cam == null)
|
||||
{
|
||||
Debug.LogError("CameraFollow需要挂载在Camera组件上");
|
||||
}
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
HandleKeyboardDrag();
|
||||
HandleMouseDrag();
|
||||
HandleKeyboardZoom();
|
||||
}
|
||||
|
||||
private void HandleKeyboardDrag()
|
||||
{
|
||||
float horizontal = 0f;
|
||||
float vertical = 0f;
|
||||
|
||||
if (Input.GetKey(KeyCode.W)) vertical = 1f;
|
||||
if (Input.GetKey(KeyCode.S)) vertical = -1f;
|
||||
if (Input.GetKey(KeyCode.A)) horizontal = -1f;
|
||||
if (Input.GetKey(KeyCode.D)) horizontal = 1f;
|
||||
|
||||
if (horizontal != 0f || vertical != 0f)
|
||||
{
|
||||
Vector3 movement = new Vector3(horizontal, 0, vertical) * keyboardDragSpeed * Time.deltaTime;
|
||||
MoveCameraWithBounds(movement);
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleMouseDrag()
|
||||
{
|
||||
// 鼠标拖动
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
lastMousePosition = Input.mousePosition;
|
||||
isDragging = true;
|
||||
}
|
||||
else if (Input.GetMouseButton(0) && isDragging)
|
||||
{
|
||||
Vector3 delta = Input.mousePosition - lastMousePosition;
|
||||
Vector3 movement = new Vector3(-delta.x, 0, -delta.y) * mouseDragSpeed * Time.deltaTime;
|
||||
MoveCameraWithBounds(movement);
|
||||
lastMousePosition = Input.mousePosition;
|
||||
}
|
||||
else if (Input.GetMouseButtonUp(0))
|
||||
{
|
||||
isDragging = false;
|
||||
}
|
||||
|
||||
// 触摸拖动(移动设备)
|
||||
if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved)
|
||||
{
|
||||
Vector2 touchDelta = Input.GetTouch(0).deltaPosition;
|
||||
Vector3 movement = new Vector3(-touchDelta.x, 0, -touchDelta.y) * touchDragSpeed * Time.deltaTime;
|
||||
MoveCameraWithBounds(movement);
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleKeyboardZoom()
|
||||
{
|
||||
if (cam == null) return;
|
||||
|
||||
float zoomDelta = 0f;
|
||||
|
||||
// 上下键控制缩放
|
||||
if (Input.GetKey(KeyCode.UpArrow)) zoomDelta = -1f; // 缩小(拉近)
|
||||
if (Input.GetKey(KeyCode.DownArrow)) zoomDelta = 1f; // 放大(拉远)
|
||||
|
||||
// 触摸双指缩放
|
||||
if (Input.touchCount == 2)
|
||||
{
|
||||
Touch touch0 = Input.GetTouch(0);
|
||||
Touch touch1 = Input.GetTouch(1);
|
||||
|
||||
Vector2 touch0PrevPos = touch0.position - touch0.deltaPosition;
|
||||
Vector2 touch1PrevPos = touch1.position - touch1.deltaPosition;
|
||||
|
||||
float prevMagnitude = (touch0PrevPos - touch1PrevPos).magnitude;
|
||||
float currentMagnitude = (touch0.position - touch1.position).magnitude;
|
||||
|
||||
float difference = currentMagnitude - prevMagnitude;
|
||||
zoomDelta = -difference * 0.01f; // 负号:手指分开=拉近,手指合拢=拉远
|
||||
}
|
||||
|
||||
if (zoomDelta != 0f)
|
||||
{
|
||||
if (cam.orthographic)
|
||||
{
|
||||
// 正交相机:调整 orthographicSize
|
||||
float newSize = cam.orthographicSize + zoomDelta * zoomSpeed * Time.deltaTime;
|
||||
cam.orthographicSize = Mathf.Clamp(newSize, minOrthographicSize, maxOrthographicSize);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 透视相机:调整 fieldOfView
|
||||
float newFov = cam.fieldOfView + zoomDelta * zoomSpeed * Time.deltaTime;
|
||||
cam.fieldOfView = Mathf.Clamp(newFov, minFieldOfView, maxFieldOfView);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void MoveCameraWithBounds(Vector3 movement)
|
||||
{
|
||||
Vector3 newPosition = transform.position + movement;
|
||||
|
||||
if (enableBounds)
|
||||
{
|
||||
newPosition.x = Mathf.Clamp(newPosition.x, minX, maxX);
|
||||
newPosition.z = Mathf.Clamp(newPosition.z, minZ, maxZ);
|
||||
}
|
||||
|
||||
transform.position = newPosition;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user