怪物AI之发现玩家(视觉范围发现系列)
在網(wǎng)上找到一些資料參考,然后寫寫自己的想法。
這里感謝MOMO等大神。
我們用玩家檢測(cè)怪物的方法來(lái)測(cè),這樣比較試用與弱聯(lián)網(wǎng)游戲,每次在同步玩家的時(shí)候來(lái)判斷玩家與怪物的位置。
這里給出兩個(gè)處理方式:
1.碰撞器R范圍檢測(cè)。
2.地圖分塊范圍檢測(cè)。
這兩種處理方式適用于不同的游戲。
再講解這兩種方式之前,我們先了解一下一個(gè)核心問(wèn)題,怪物在玩家R半徑內(nèi)時(shí)怎么判斷怪物是否在玩家視覺(jué)范圍內(nèi)。
如下圖
在圖中,
玩家的位置與怪物的位置會(huì)成一個(gè)向量。設(shè)為V1
怪物的朝向也是一個(gè)向量。設(shè)為V2
如果怪物能看到60°的角度的話。那么Vector(V1,V2)如果小于30°則證明玩家在怪物的視覺(jué)范圍內(nèi)。
代碼為:
PS:如果想在三維上進(jìn)行判斷的話,同理在處理一下yz軸平面就ok了。
現(xiàn)在我們講解一下第一種處理方式:
這種比較簡(jiǎn)單也很無(wú)腦。給Player加一個(gè)SphereCollider就好了,而且這樣也可以判斷三維狀態(tài)。注:如果用Terrain做地面請(qǐng)屏蔽。
碰撞器代碼:
然后就是第二種比較有想法的方式了。
將游戲地圖分塊。如下圖
這里呢。大體思路為:
玩家在0號(hào)塊,在這個(gè)狀態(tài)的時(shí)候,只有a,b怪物可以與玩家進(jìn)行角度判斷,cdef都忽略掉。
代碼如下:
Map.cs:
玩家AI.cs:
public class PlayerAI : MonoBehaviour {Vector3 v;Vector3 w;Vector3 otherPos;GameObject[] Monster = new GameObject[10];private bool Find(GameObject _Monster){otherPos = _Monster.gameObject.transform.position;v = transform.position - otherPos;v.y = 0.5f;w = _Monster.gameObject.GetComponent<MonsterAI>().getFace() - otherPos;w.y = 0.5f;if (Vector3.Angle(v, w) < 30){return true;}return false;}//void OnTriggerEnter(Collider other)//{// if (!other.name.Equals("Terrain"))// {// if (Find(other.gameObject))// {// Debug.Log("發(fā)現(xiàn)");// }// }//}void Update(){int pos = Map.Instance.getPlayerPos(gameObject);if (pos != -1){Monster = Map.Instance.getMonster(pos);}for (int i = 0; i < Monster.Length; i++){if (Monster[i] != null){if (Find(Monster[i])){Debug.Log(i + "發(fā)現(xiàn)");}}}} }怪物AI.cs:
public class MonsterAI : MonoBehaviour {public GameObject Player;private Vector3 Face;void Start () {Face = transform.position + transform.rotation * Vector3.forward * 10;Map.Instance.setMonsterPos(gameObject);}public Vector3 getFace(){return Face;}void Update(){Face = transform.position + transform.rotation * Vector3.forward * 10;//Debug.DrawLine(transform.position, Face, Color.red);} }總結(jié)
以上是生活随笔為你收集整理的怪物AI之发现玩家(视觉范围发现系列)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 环保数采仪环境污染在线监控设备 上传监控
- 下一篇: 腾讯AI Lab副主任俞栋:过去两年基于