需要在当前视野范围内随机生成物体时使用,比如在屏幕上生成烟花等特效。。
/// <summary>
/// 根据距离摄像机的位置得出平面范围
/// </summary>
/// 0 1
/// 3 2
/// <param name="distance">平面与相机的距离</param>
/// <param name="cam">相机</param>
/// <returns></returns>
Vector3[] GetCorners(float distance, Camera cam)
{
var transCam = cam.transform;
Vector3[] corners = new Vector3[4];
float halfFOV = (cam.fieldOfView * 0.5f) * Mathf.Deg2Rad;
float aspect = cam.aspect;
float height = distance * Mathf.Tan(halfFOV);
float width = height * aspect;
// 左上
corners[0] = transCam.position - (transCam.right * width);
corners[0] += transCam.up * height;
corners[0] += transCam.forward * distance;
// 右上
corners[1] = transCam.position + (transCam.right * width);
corners[1] += transCam.up * height;
corners[1] += transCam.forward * distance;
// 右下
corners[2] = transCam.position + (transCam.right * width);
corners[2] -= transCam.up * height;
corners[2] += transCam.forward * distance;
// 左下
corners[3] = transCam.position - (transCam.right * width);
corners[3] -= transCam.up * height;
corners[3] += transCam.forward * distance;
return corners;
}
private void RandomCreate()
{
//得出距离相机50个单位的平面
var corners = GetCorners(50, _Camera);
//该平面的 x y 的最大最小值
var minX = corners[0].x;
var maxX = corners[1].x;
var minY = corners[3].y;
var maxY = corners[1].y;
//随机物体生成的位置
var x = Random.Range(minX, maxX);
var y = Random.Range(minY, maxY);
var z = corners[0].z;
//生成物体
var go = GameObject.CreatePrimitive(PrimitiveType.Cube);
go.transform.position = new Vector3(x, y, z);
}