建議閱讀: 判斷敵人在玩家的某一個區域: 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("位置: 右下");}} }
?
判斷之后的效果圖:(人物頭頂的紅色表示可以攻擊)
?
?