Unity游戏开发笔记:获取主角周围的怪物

版权声明:原创笔记 ----黑暗灵魂 https://blog.csdn.net/qq_38843118/article/details/84960673

1、获取距离主角最近的一个怪物

方法一:球形射线检测,Physics.OverlapSphere

用球形射线检测主角周围方圆X米的怪物,如果检测到怪物,即可返回此怪物,如果没有检测到怪物,将检测范围(即半径)扩大,直到检测到怪物为止。

    public Transform OnGetEnemy()
    {
        //正在搜索的半径
        int radius = 1;
        //一步一步扩大搜索半径,最大扩大到100
        while (radius < 100)
        {
            //球形射线检测,得到半径radius米范围内所有的物件
            Collider[] cols = Physics.OverlapSphere(transform.position, radius);
            //判断检测到的物件中有没有Enemy
            if (cols.Length > 0)
                for (int i = 0; i < cols.Length; i++)
                    if (cols[i].tag.Equals("Enemy"))
                        return cols[i].transform;
            //没有检测到Enemy,将检测半径扩大2米
            radius += 2;
        }
        return null;
    }

方法二:比较所有怪物与主角之间的距离

获取所有怪物,计算每一个怪物与主角之间的距离,进行比较,选择一个与主角距离最短的怪物。

    public Transform OnGetEnemy()
    {
        //获取所有敌人
        GameObject[] enemy = GameObject.FindGameObjectsWithTag("Enemy");
        float distance_min = 10000;    //主角与怪物的最近距离
        float distance = 0;            //当前怪物与主角的距离
        int id = 0;                    //与主角最近的怪物的编号
        //遍历所有敌人,计算距离并比较
        for (int i = 0; i < enemy.Length; i++)
        {
            if (enemy[i].activeSelf == true)
            {
                distance = Vector3.Distance(transform.position, enemy[i].transform.position);
                if (distance < distance_min)
                {
                    //找到一个更近的
                    distance_min = distance;
                    id = i;
                }
            }
        }
        return enemy[id].transform;
    }

2、获取主角前方60度范围内,距离小于2米的怪物

用球形射线检测主角周围方圆2米的怪物,如果检测到怪物,再判断怪物是否在主角正前方60度范围内,如果【主角正前方向】与【主角怪物连线】的夹角小于30度,即可得知此怪物是所求怪物。

    //获取主角前方60度范围内,距离小于2的敌人
    public void OnGetEnemy(Transform player, int radius, int angle)
    {
        //球形射线检测,得到主角半径2米范围内所有的物件
        Collider[] cols = Physics.OverlapSphere(player.position, radius);
        //判断检测到的物件中有没有Enemy
        if (cols.Length > 0)
            for (int i = 0; i < cols.Length; i++)
                //判断是否是怪物
                if (cols[i].tag.Equals("Enemy"))
                {
                    //判断敌人是否在主角前方60度范围内
                    Vector3 dir = cols[i].transform.position - player.position;
                    if (Vector3.Angle(dir, player.forward) < angle)
                        cols[i].GetComponent<BaseHero>().OnTakeDamage();
                }
    }

猜你喜欢

转载自blog.csdn.net/qq_38843118/article/details/84960673