Unity 透视摄像机视野适配不同分辨率的屏幕
正交摄像机的请看这篇文章,就懒得再写一次了:Unity UGUI使用技巧与经验总结(不定期更新)_unity ugui技巧 之 text文本框随内容自动调整-CSDN博客
相关注释请看代码中的说明
using UnityEngine;/// <summary>
/// 透视摄像机视野适配,注意单独修改视野大小容易造成透视效果不佳的情况,请慎用
/// </summary>
public class CameraAutoFix : MonoBehaviour
{[Tooltip("顶部需要显示的物体")]public Transform topPos;[Tooltip("底部需要显示的物体")]public Transform bottomPos;public Camera m_Camera;/// <summary>/// 因为要转换为WebGL平台,webgl平台会将结构体转换为一个class,所以这里单独声明并缓存一下,下方使用set函数进行值的修改则是为了避免修改时new一个新的Vector3对象出来/// </summary>private Vector3 topV = new Vector3();private Vector3 bottomV = new Vector3();[Space][Tooltip("左侧需要显示的物体")]public Transform leftPos;[Tooltip("右侧需要显示的物体")]public Transform rightPos;#if UNITY_EDITOR[Space]public bool resetSet = false;#endifpublic void Awake(){if (m_Camera == null)m_Camera = GetComponent<Camera>();AutoFixedFovSize();}#if UNITY_EDITORprivate void Update(){if (resetSet){AutoFixedFovSize();resetSet = false;}}#endif// FOV: 相机的垂直视野,以度为单位/// <summary>/// 自动调整视野大小/// </summary>private void AutoFixedFovSize(){float targetValue = 0;// 将角度进行转换if (Screen.height < Screen.width) // 竖屏{topV.Set(topPos.position.x - m_Camera.transform.position.x, topPos.position.y - m_Camera.transform.position.y, topPos.position.z - m_Camera.transform.position.z);bottomV.Set(bottomPos.position.x - m_Camera.transform.position.x, bottomPos.position.y - m_Camera.transform.position.y, bottomPos.position.z - m_Camera.transform.position.z);// 因为测试下来,所得到的角度,差不多为所需角度的一半,所以这里*2翻倍一下targetValue = Vector3.Angle(topV, bottomV) * 2;}else{// 取摄像机看向所需显示的点的角度topV.Set(leftPos.position.x - m_Camera.transform.position.x, leftPos.position.y - m_Camera.transform.position.y, leftPos.position.z - m_Camera.transform.position.z);bottomV.Set(rightPos.position.x - m_Camera.transform.position.x, rightPos.position.y - m_Camera.transform.position.y, rightPos.position.z - m_Camera.transform.position.z);targetValue = Camera.VerticalToHorizontalFieldOfView(Vector3.Angle(topV, bottomV), (float)Screen.height / Screen.width);}// 原始配置可用时,则不进行更改if (m_Camera.fieldOfView < targetValue)m_Camera.fieldOfView = targetValue;}
}