游戏中很多功能需要获取视野边缘的坐标,或者判断给定点是否在视野内,比如很多俯视视角Rogue游戏通过检测视野边缘来自动生成敌人。
通过在初始时遍历屏幕左下、左上、右上、右下四个点,分别从屏幕发出一条射线,即可获得与地面平面碰撞的四个交点,这四个点构成的平面就是视野范围。如果地面是近似无限的平面,那么把从摄像机初始到当前的位置向量,分别加上与这四个点的偏移,就可以得到当前的摄像机视野范围。假设这四个点围成的线段长度为l1,l2,l3,l4,总长度为L,那么可以求得落在视野边缘的随机一点。
public void Start()
{
Vector3[] iniWidePos;
iniWidePos = new Vector3[4];
iniWidePos[0].x = 0;
iniWidePos[0].y = 0;
iniWidePos[1].x = 0;
iniWidePos[1].y = Screen.height;
iniWidePos[2].x = Screen.width;
iniWidePos[2].y = Screen.height;
iniWidePos[3].x = Screen.width;
iniWidePos[3].y = 0;
for (int i = 0; i < iniWidePos.Length; i++)
{
Ray ray = Camera.main.ScreenPointToRay(iniWidePos[i]);
if (Physics.Raycast(ray, out var hit))
{
//Debug.DrawLine(ray.origin, hit.point, Color.red, int.MaxValue);
iniWidePos[i] = hit.point;
}
}
}