1. 程式人生 > >Unity遊戲開發筆記:獲取主角周圍的怪物

Unity遊戲開發筆記:獲取主角周圍的怪物

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();
                }
    }