生活随笔
收集整理的這篇文章主要介紹了
[Unity3D]Unity3D游戏开发之怪物AI
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
大家好,歡迎大家關(guān)注由我為大家?guī)?lái)的Unity3D游戲開(kāi)發(fā)系列文章,我的博客地址為:http://blog.csdn.net/qinyuanpei。
? ? ? ?在上一篇文章中,我們基本上實(shí)現(xiàn)了一個(gè)小地圖的功能,今天呢,我們來(lái)實(shí)現(xiàn)怪物AI,所謂怪物AI就是指我們?yōu)楣治锞帉懸欢ǖ乃惴?#xff0c;使其可以具備一定程度的智能化,以增強(qiáng)游戲的可玩性。在一般的RPG游戲中,怪物通常在一個(gè)游戲設(shè)定的范圍內(nèi)巡邏,當(dāng)玩家進(jìn)入怪物的警戒范圍時(shí),怪物就會(huì)由巡邏狀態(tài)轉(zhuǎn)變?yōu)楣魻顟B(tài),向玩家進(jìn)行攻擊,那么,我們今天就來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的怪物AI吧,下面我們一起來(lái)看代碼:
[csharp]?view plaincopyprint?
using?UnityEngine;?? using?System.Collections;?? ?? public?class?AI?:?MonoBehaviour?{?? ?? ?????? ????public?const?int?STATE_STAND=0;?? ????public?const?int?STATE_WALK=1;?? ????public?const?int?STATE_RUN=2;?? ?????? ?????? ????private?int?NowState;?? ?????? ????public?GameObject?Hero;?? ?????? ????public?const?int?AI_THINK_TIME=2;?? ?????? ????public?const?int?AI_ATTACT_DISTANCE=10;?? ?????? ?????? ????private?float?LastThinkTime;?? ?????? ????void?Start?()??? ????{?? ?????????? ????}?? ?????? ????void?Update?()??? ????{?? ????????? ???????if(Vector3.Distance(transform.position,Hero.transform.position)<AI_ATTACT_DISTANCE)?? ???????{?? ???????????? ??????????this.GetComponent<Animation>().Play("run");?? ???????????? ??????????NowState=STATE_RUN;?? ???????????? ??????????transform.LookAt(Hero.transform);?? ???????????? ??????????transform.Translate(Vector3.forward*Time.deltaTime?*?5);?? ???????}else?? ???????{?? ???????????? ??????????if(Time.time-LastThinkTime>AI_THINK_TIME)?? ??????????{?? ??????????????? ?????????????LastThinkTime=Time.time;?? ??????????????? ?????????????int?Rnd=Random.Range(0,2);???????? ??????????????? ?????????????switch(Rnd)?? ?????????????{?? ????????????????case?0:?? ?????????????????? ????????????????this.GetComponent<Animation>().Play("idle");?? ????????????????NowState=STATE_STAND;?? ????????????????break;?? ?????????????????? ????????????????case?1:?? ?????????????????? ?????????????????? ????????????????Quaternion?mRotation=Quaternion.Euler(0,Random.Range(1,5)*90,0);?? ????????????????transform.rotation=Quaternion.Slerp(transform.rotation,mRotation,Time.deltaTime*1000);?? ?????????????????? ????????????????this.GetComponent<Animation>().Play("walk");?? ?????????????????? ????????????????transform.Translate(Vector3.forward*Time.deltaTime?*?3);?? ????????????????NowState=STATE_WALK;?? ????????????????break;?? ????????????????? ????????????????case?2:?? ?????????????????? ????????????????this.GetComponent<Animation>().Play("run");?? ????????????????transform.Translate(Vector3.forward*Time.deltaTime?*?5);?? ????????????????NowState=STATE_RUN;?? ????????????????break;?? ?????????????}??? ??????????}?? ???????}?? ????}?? }??
? ? ? ? ? 在上面的代碼中,能夠觸發(fā)怪物狀態(tài)發(fā)生變化的有兩個(gè)條件,第一,是玩家進(jìn)入了怪物的警范圍,此時(shí)怪物將面向玩家奔跑靠近;第二,當(dāng)前時(shí)間與怪物上一次思考的時(shí)間之差大于怪物的思考時(shí)間,此時(shí),怪物將隨機(jī)作出反應(yīng)。
? ? ? ? ? 好,下面我們回到游戲界面當(dāng)中來(lái)。
? ? ? ? 如圖,博主事先從官方資源商店里下載了一個(gè)人物模型。在這個(gè)模型中,設(shè)計(jì)者已經(jīng)為我們?cè)O(shè)計(jì)好了人物動(dòng)畫,我們將這個(gè)模型拖放到場(chǎng)景中,調(diào)整到合適的位置,并將人物默認(rèn)動(dòng)畫設(shè)置為idle,下面我們將剛才寫好的腳本拖放到此模型上,并設(shè)置Hero為我們的玩家對(duì)象,在這里我們使用了官方提供的第三人稱角色控制器組件,最終實(shí)現(xiàn)的效果如下 :
? ? ? ?可以看到,在不同的時(shí)刻,怪物可以自己執(zhí)行不同的狀態(tài)動(dòng)作,當(dāng)玩家靠近怪物的時(shí)候,會(huì)被敵人追擊,這就是今天的內(nèi)容啦,謝謝大家!
轉(zhuǎn)載:原文出處
總結(jié)
以上是生活随笔為你收集整理的[Unity3D]Unity3D游戏开发之怪物AI的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。