日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > ChatGpt >内容正文

ChatGpt

怪物AI之发现玩家(视觉范围发现系列)

發(fā)布時(shí)間:2023/12/20 ChatGpt 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 怪物AI之发现玩家(视觉范围发现系列) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在網(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)。
代碼為:

private bool Find(GameObject _Monster){Vector3 otherPos = _Monster.gameObject.transform.position;v = transform.position - otherPos;v.y = 0.5f; //處理一下y軸,因?yàn)榕袛嘟⒃诙S上w = _Monster.gameObject.GetComponent<FindPlayerAI>().getFace() - otherPos;w.y = 0.5f;if (Vector3.Angle(v, w) < 30){return true;}return false;}

PS:如果想在三維上進(jìn)行判斷的話,同理在處理一下yz軸平面就ok了。

現(xiàn)在我們講解一下第一種處理方式:
這種比較簡(jiǎn)單也很無(wú)腦。給Player加一個(gè)SphereCollider就好了,而且這樣也可以判斷三維狀態(tài)。注:如果用Terrain做地面請(qǐng)屏蔽。
碰撞器代碼:

void OnTriggerEnter(Collider other){if (!other.name.Equals("Terrain")){if (Find(other.gameObject)) //接上一個(gè)Find代碼{Debug.Log("發(fā)現(xiàn)");}}}

然后就是第二種比較有想法的方式了。
將游戲地圖分塊。如下圖

這里呢。大體思路為:
玩家在0號(hào)塊,在這個(gè)狀態(tài)的時(shí)候,只有a,b怪物可以與玩家進(jìn)行角度判斷,cdef都忽略掉。
代碼如下:
Map.cs:

public class Map : MonoBehaviour{private static Map _Instance;public static Map Instance{get{if (_Instance == null){_Instance = new GameObject("_Map").AddComponent<Map>();}return _Instance;}}private int PlayerPos = -1;private GameObject[][] Monster = new GameObject[100][];private int[] MonsterNum = new int[100];//public int n = 0;void Awake(){ for (int i = 0; i < 100; i++){Monster[i] = new GameObject[10];MonsterNum[i] = 0;}}int getPos(GameObject go){float x = go.transform.position.x;float z = go.transform.position.z;x /= 20;z /= 20;int pos = (int)(Mathf.Floor(x) + Mathf.Floor(z) * 10);return pos;}public void setMonsterPos(GameObject _Monster){int pos = getPos(_Monster);Monster[pos][MonsterNum[pos]++] = _Monster;Debug.Log(pos + _Monster.name);}public int getPlayerPos(GameObject _Player){int pos = getPos(_Player);if (PlayerPos == pos){return -1;}else{PlayerPos = pos;}return pos;}public GameObject[] getMonster(int pos){return Monster[pos];}}

玩家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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。