寻找3d地图上没有障碍物的点

 

//最后检测到的没有障碍物的位置
    Vector3 strkeFlyPos;

    //向量每次的旋转角度
    public float rotationAngle = 180;

    //方向向量 ,表示x轴的正方向
    Vector3 dirTarget = new Vector3(5, 0, 0);
    //向量的长度
    float _v3Lenght = 5;

    //目标位置
    Vector3 _target;

    /// <summary>
    /// 找到以自身为原点地图上没有障碍物的点
    /// </summary>
    /// <param name="_angle"></param>
    public void StrkeFly(float _angle)
    {
        for (int i = 0; i < 360 / _angle; i++)
        {

            //暂时记录找到的当前点的位置  //让自身加上半径(这个半径就是一个左侧为5的方向向量),让这个向量旋转,得到自身周围一个圆形的点
            Vector3 tempPos = transform.position + Quaternion.AngleAxis(_angle * i, transform.up) * dirTarget.normalized * _v3Lenght;

            //从摄像机发射一条射线检测这个点位置是否是障碍物
            Ray ray = new Ray(Camera.main.transform.position, tempPos - Camera.main.transform.position);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit))
            {
                //如果不是就让敌人被击飞到这个点
                if (hit.transform.tag == "ground")
                {
                    _target = hit.point;

                    //找到目标位置后调用飞行的方法
                    StartCoroutine("FlyTaget");
                    return;
                }

            }
        }
        //当找完一周之后,没有找到,那么缩小向量的旋转角度,并调用自身
        if (_angle > 1)
        {
            StrkeFly(_angle / 2);
            return;
        }
        //当角度小于1的时候还没有找到,那么就缩小向量的长度继续寻找
        if (_angle < 1 && _v3Lenght > 1)
        {
            _v3Lenght -= 1;
            StrkeFly(_angle);
            return;
        }

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值