CameraFieldOfViewOptions.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using System;
  2. using UnityEngine;
  3. namespace XGame.Framework.Map
  4. {
  5. /// <summary>
  6. /// 相机的fieldOfView设置参数
  7. /// 相机默认以高度自适应,以保证垂直方向的显示内容一致,
  8. /// 竖屏游戏地图需要固定宽度以保证水平方向的显示内容一致,
  9. /// 横屏游戏不需要该设置
  10. /// </summary>
  11. [Serializable]
  12. public struct CameraFieldOfViewOptions
  13. {
  14. /// <summary>
  15. /// 是否固定宽度
  16. /// Camera.FieldOfViewAxis.Horizontal
  17. /// </summary>
  18. [Header("是否固定宽度")]
  19. public bool isLockHorizontal;
  20. /// <summary>
  21. /// orthographicSize参考值,正交相机有效
  22. /// 修正时以该值为基础根据分辨率重新计算
  23. /// </summary>
  24. [Header("orthographicSize参考值,正交相机有效")]
  25. public float size;
  26. /// <summary>
  27. /// fov参考值,透视相机有效
  28. /// 取相机的FOVAxis==Horizontal时FieldOfView的值
  29. /// 赋值完相机需要设置为FOVAxis=Vertical
  30. /// 相机视口度数
  31. /// </summary>
  32. [Header("fov参考值,透视相机有效")]
  33. public float fieldOfView;
  34. ///// <summary>
  35. ///// 地图相机的设计分辨率
  36. ///// 只用来计算长宽比
  37. ///// </summary>
  38. //[Header("地图相机的设计分辨率,只用来计算长宽比")]
  39. //public Vector2Int designSize;
  40. /// <summary>
  41. /// 修正fov
  42. /// 以相机的FOVAxis==Vertical计算
  43. /// </summary>
  44. /// <param name="camera"></param>
  45. public void FixFieldOfView(Camera camera)
  46. {
  47. if (!isLockHorizontal)
  48. return;
  49. if (camera.orthographic)
  50. {
  51. camera.orthographicSize = size / camera.aspect * 0.5f;
  52. }
  53. else
  54. {
  55. var target = Mathf.Tan(fieldOfView * Mathf.PI / 360f) / camera.aspect;
  56. camera.fieldOfView = Mathf.RoundToInt(Mathf.Atan(target) * Mathf.Rad2Deg * 2);
  57. }
  58. }
  59. }
  60. }