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

Unity 2D游戏鼠标中心缩放功能实现求助(不可修改相机)

解决Unity 2D鼠标中心滚轮缩放(仅调整GameObject Transform)的位置偏移问题

你的核心问题是鼠标相对位置的计算逻辑错误,原代码里的百分比计算公式完全偏离了正确的坐标映射逻辑。要实现浏览器式的鼠标中心缩放,关键是让缩放前后,鼠标光标对应的GameObject上的点保持一致,下面是修正后的实现方案:

正确实现思路

  1. 缩放前,记录鼠标在世界空间中的位置,以及该点相对于GameObject中心的偏移量(基于当前缩放比例)。
  2. 更新缩放值并应用到Transform。
  3. 根据新的缩放比例,计算GameObject需要移动的偏移量,让原来的鼠标对应点重新回到鼠标当前的世界位置。

修正后的代码

void Update()
{
    float zoomDelta = Input.GetAxis("Mouse ScrollWheel");
    if (zoomDelta == 0) return;

    // 1. 记录缩放前的关键数据
    Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    mouseWorldPos.z = transform.position.z; // 保持Z轴一致,避免2D场景中Z值干扰
    Vector3 offsetFromObjectCenter = mouseWorldPos - transform.position;
    float oldZoom = currentZoom;

    // 2. 更新并限制缩放值
    currentZoom += zoomDelta;
    currentZoom = Mathf.Clamp(currentZoom, minZoom, maxZoom);
    transform.localScale = new Vector3(currentZoom, currentZoom, 1f);

    // 3. 计算并调整位置,确保鼠标点始终对应物体上的同一点
    float scaleRatio = currentZoom / oldZoom;
    Vector3 newOffset = offsetFromObjectCenter * scaleRatio;
    transform.position = mouseWorldPos - newOffset;
}

关键逻辑解释

  • 偏移量记录:offsetFromObjectCenter是缩放前鼠标位置到物体中心的距离,这个值代表了鼠标在物体上的相对位置。
  • 缩放比例计算:scaleRatio是新缩放与旧缩放的比值,用来计算偏移量在缩放后的变化。
  • 位置调整:缩放后,物体中心需要移动到mouseWorldPos - newOffset,这样原来鼠标对应的物体上的点会刚好落在当前鼠标的世界位置,实现中心缩放效果。

补充说明

如果你的fieldMask是用来限制物体缩放边界的,后续可以在位置调整后添加边界检测逻辑,确保物体不会超出指定区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 02:21:03