介绍
部落冲突这款游戏中可以使用双指缩放地图,在缩放时会以双指中心点进行缩放。
实际项目中如何在 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 会受浮点精度影响,具体表现为相机的世界坐标值绝对值过大时,缩放或移动时会抖动,有两种方式:
- 建议修改设计方案,将相机移回原点附近,这是最合理的方案,可以规避浮点数造成的其他问题
- 手动进行坐标系转换,去除浮点数影响。