You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:避免极小速度导致的相机抖动,低于阈值直接清零速度

使用方法

  1. 将脚本挂载到你的正交相机对象上
  2. 在Inspector面板调整参数适配你的游戏场景
  3. 运行测试,拖拽鼠标即可实现谷歌地图式的移动+惯性滑动效果

内容的提问来源于stack exchange,提问作者SoManyQuestions

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:52:10