正交摄像机的请看这篇文章,就懒得再写一次了:Unity UGUI使用技巧与经验总结(不定期更新)_unity ugui技巧 之 text文本框随内容自动调整-优快云博客
相关注释请看代码中的说明
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;
#endif
public void Awake()
{
if (m_Camera == null)
m_Camera = GetComponent<Camera>();
AutoFixedFovSize();
}
#if UNITY_EDITOR
private 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;
}
}
3135

被折叠的 条评论
为什么被折叠?



