Unity3D中如何实现谷歌地图式正交相机移动效果?
正交相机谷歌地图式拖拽+惯性滑动实现方案
直接上可运行的Unity C#脚本,无需依赖Rigidbody,纯代码模拟惯性效果:
using UnityEngine; public class OrthoCameraDrag : MonoBehaviour { // 拖拽灵敏度,值越大拖拽时相机移动越快 public float dragSensitivity = 2f; // 惯性摩擦力,值越大惯性停止越快(取值0-1) public float friction = 0.9f; // 最小速度阈值,低于此值直接停止惯性滑动 public float minVelocity = 0.01f; private bool isDragging; private Vector3 lastMouseWorldPos; private Vector3 currentVelocity; void Update() { // 鼠标左键按下,初始化拖拽状态 if (Input.GetMouseButtonDown(0)) { isDragging = true; lastMouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); currentVelocity = Vector3.zero; } // 鼠标左键按住,执行拖拽移动 if (Input.GetMouseButton(0) && isDragging) { Vector3 currentMouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); // 计算鼠标偏移量,反方向即为相机移动方向 Vector3 offset = lastMouseWorldPos - currentMouseWorldPos; transform.position += offset * dragSensitivity; // 记录鼠标移动瞬时速度,用于后续惯性计算 currentVelocity = offset / Time.deltaTime; lastMouseWorldPos = currentMouseWorldPos; } // 鼠标左键抬起,结束拖拽进入惯性阶段 if (Input.GetMouseButtonUp(0)) { isDragging = false; } // 非拖拽状态下处理惯性滑动 if (!isDragging && currentVelocity.magnitude > minVelocity) { currentVelocity *= friction; transform.position += currentVelocity * Time.deltaTime * dragSensitivity; // 速度低于阈值时直接停止,避免抖动 if (currentVelocity.magnitude < minVelocity) { currentVelocity = Vector3.zero; } } } }
关键逻辑说明
- 坐标转换:通过
ScreenToWorldPoint将鼠标屏幕坐标转换为正交相机的世界坐标,确保拖拽偏移量与相机移动比例匹配 - 惯性计算:拖拽时记录鼠标移动的瞬时速度,松开鼠标后通过持续乘以摩擦力让速度衰减,模拟自然的滑动减速效果
- 参数调节:
dragSensitivity:根据场景大小调整,适配拖拽手感friction:控制惯性滑动距离,值越小滑得越远,值越大停得越快minVelocity:避免极小速度导致的相机抖动,低于阈值直接清零速度
使用方法
- 将脚本挂载到你的正交相机对象上
- 在Inspector面板调整参数适配你的游戏场景
- 运行测试,拖拽鼠标即可实现谷歌地图式的移动+惯性滑动效果
内容的提问来源于stack exchange,提问作者SoManyQuestions
相关产品推荐
相关产品推荐

