人物角色群体攻击判定二(叉乘来判断敌人的位置)
建议阅读: 判断敌人在玩家的某一个区域: http://www.cnblogs.com/plateFace/p/4716799.html
我们可以根据玩家和敌人的坐标, 进行叉乘来获取一个向量可以用它来判断敌人的位置, 敌人是否在攻击范围内. 下面我简单实现下对单体敌人是否攻击做判定
这种方式有一种重大的BUG, 假设我把敌人大小增加100倍, 很显然玩家已经在敌人的体内了. 我们是通过坐标来判断敌人是否可以攻击, 跟敌人的体积大小无关系. 所以攻击的距离是跟敌人体积的大小所决定的
代码的实现:
using UnityEngine; using System.Collections; using System.Collections.Generic; public class Player : MonoBehaviour { public float speed = 2; public GameObject enemy; public Dictionary<string,GameObject> enemyList = new Dictionary<string,GameObject>(); public TextMesh text1; public TextMesh text2; //判断敌人是否可以攻击 public void CanAttack(GameObject obj) { Vector3 toOther = this.transform.position - obj.gameObject.transform.position; Vector3 chaCheng1 = Vector3.Cross(transform.forward, toOther); Vector3 chaCheng2 = Vector3.Cross(transform.right, toOther); //调试距离的代码 text1.text = chaCheng1.ToString (); text2.text = chaCheng2.ToString (); //经过调试 前后距离是3 左右距离是2, //当敌人在左上或右上 并且 距离小于攻击距离, 就可以攻击 if (chaCheng1.y > 0 && chaCheng2.y > 0) { Debug.Log("位置: 左上"); if(Mathf.Abs(chaCheng2.y) <= 3 && Mathf.Abs(chaCheng1.y) <= 2) { //打开头顶可攻击标示 obj.gameObject.transform.FindChild ("T").gameObject.SetActive(true); }else { obj.gameObject.transform.FindChild ("T").gameObject.SetActive(false); } return; } if (chaCheng1.y < 0 && chaCheng2.y > 0) { Debug.Log("位置: 右上"); if(Mathf.Abs(chaCheng2.y) <= 3 && Mathf.Abs(chaCheng1.y) <= 2) { obj.gameObject.transform.FindChild ("T").gameObject.SetActive(true); }else { obj.gameObject.transform.FindChild ("T").gameObject.SetActive(false); } return; } obj.gameObject.transform.FindChild ("T").gameObject.SetActive(false); if (chaCheng1.y > 0 && chaCheng2.y < 0) { Debug.Log("位置: 左下"); return; } if (chaCheng1.y < 0 && chaCheng2.y < 0) { Debug.Log("位置: 右下"); } } }
判断之后的效果图:(人物头顶的红色表示可以攻击)
如果你感兴趣,你可以把你妹妹介绍给我