介绍

部落冲突这款游戏中可以使用双指缩放地图,在缩放时会以双指中心点进行缩放。

实际项目中如何在 2D 相机与 3D 相机中实现此效果?

分析

修改 2D 相机的 OrthoganalSize 与 3D 相机的 FOV 只会沿着屏幕中心缩放,其实如果想要实现指定点的缩放,可以在缩放后移动回原来的位置就可以模拟在指定点缩放的效果。

桌面平台使用鼠标位置,移动平台使用双指中间点位置,处理方式是一样的。

代码

2D

1
2
3
4
5
var oldPosition = _camera.ScreenToWorldPoint(Input.mousePosition);
TargetSize -= scrollWheel * Time.deltaTime * ZoomSpeed * TargetSize;
_camera.orthographicSize = TargetSize;
var newPosition = _camera.ScreenToWorldPoint(Input.mousePosition);
_camera.transform.position += oldPosition - newPosition;

3D

1
2
3
4
5
var oldPosition = _camera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Farclip));
TargetSize -= scrollWheel * Time.deltaTime * ZoomSpeed * TargetSize;
_camera.fieldOfView = TargetSize;
var newPosition = _camera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Farclip));
_camera.transform.position += oldPosition - newPosition;

Demo

有两个示例:CameraZoom2D 与 CameraZoom3D,在 Unity 2019.4.32f1 下测试通过。

注意

Unity - Scripting API: Camera.ScreenToWorldPoint API 会受浮点精度影响,具体表现为相机的世界坐标值绝对值过大时,缩放或移动时会抖动,有两种方式:

  1. 建议修改设计方案,将相机移回原点附近,这是最合理的方案,可以规避浮点数造成的其他问题
  2. 手动进行坐标系转换,去除浮点数影响。