Unity 2D游戏鼠标中心缩放功能实现求助(不可修改相机)
解决Unity 2D鼠标中心滚轮缩放(仅调整GameObject Transform)的位置偏移问题
你的核心问题是鼠标相对位置的计算逻辑错误,原代码里的百分比计算公式完全偏离了正确的坐标映射逻辑。要实现浏览器式的鼠标中心缩放,关键是让缩放前后,鼠标光标对应的GameObject上的点保持一致,下面是修正后的实现方案:
正确实现思路
- 缩放前,记录鼠标在世界空间中的位置,以及该点相对于GameObject中心的偏移量(基于当前缩放比例)。
- 更新缩放值并应用到Transform。
- 根据新的缩放比例,计算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
相关产品推荐
相关产品推荐

