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