在屏幕范围内随机生成物体

需要在当前视野范围内随机生成物体时使用,比如在屏幕上生成烟花等特效。。

   /// <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);
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值