RPG游戏中如何判断敌人是否在玩家的攻击范围之内

 1 // 方式1:通过主角和场景中的所有敌人比较
 2 private void AtkCondition1(float _range,float _angle)
 3 {
 4     // 搜索所有敌人列表(在动态创建敌人时生成的)
 5     // 列表存储的并非敌人的GameObject而是自定义的Enemy类
 6     // Enemy类的一个变量mGameObject则用来存储实例出来的敌人实例
 7     foreach (var go in GameManager.GetInstance.gMonsterDict)
 8     {
 9         // 敌人的坐标向量减去Player的坐标向量的长度(使用magnitude)
10         float tempDis1 = (go.Value.mGameObject.transform.position - mGameObject.transform.position).magnitude;
11         // 敌人向量减去Player向量就能得到Player指向敌人的一个向量
12         Vector3 v3 = go.Value.mGameObject.transform.position - mGameObject.transform.position;
13         // 求出Player指向敌人和Player指向正前方两向量的夹角,其实就是Player和敌人的夹角(不分左右)
14         float angle = Vector3.Angle( v3, mGameObject.transform.forward);
15         if (tempDis1 < _range && angle < _angle)
16         {
17             // 距离和角度条件都满足了
18         }
19     }
20 }
21 // 方式2:通过主角和射线检测到的敌人比较
22 private void AtkCondition2(float _range,float _angle)
23 {
24     // 球形射线检测周围怪物,不用循环所有怪物类列表,无法获取“Enemy”类
25     Collider[] colliderArr = Physics.OverlapSphere(mGameObject.transform.position, _range, LayerMask.GetMask("Enemy"));
26     for (int i = 0; i < colliderArr.Length; i++)
27     {
28         Vector3 v3 = colliderArr[i].gameObject.transform.position - mGameObject.transform.position;
29         float angle = Vector3.Angle(v3, mGameObject.transform.forward);
30         if (angle < _angle)
31         {
32             // 距离和角度条件都满足了
33         }
34     }
35 }

参考:https://blog.csdn.net/chy_xfn/article/details/52512343

猜你喜欢

转载自www.cnblogs.com/luguoshuai/p/10043355.html