生活随笔
收集整理的這篇文章主要介紹了
[Unity3D]Unity3D游戏开发之怪物AI
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大家好,歡迎大家關注由我為大家帶來的Unity3D游戲開發系列文章,我的博客地址為:http://blog.csdn.net/qinyuanpei。
? ? ? ?在上一篇文章中,我們基本上實現了一個小地圖的功能,今天呢,我們來實現怪物AI,所謂怪物AI就是指我們為怪物編寫一定的算法,使其可以具備一定程度的智能化,以增強游戲的可玩性。在一般的RPG游戲中,怪物通常在一個游戲設定的范圍內巡邏,當玩家進入怪物的警戒范圍時,怪物就會由巡邏狀態轉變為攻擊狀態,向玩家進行攻擊,那么,我們今天就來實現一個簡單的怪物AI吧,下面我們一起來看代碼:
[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;?? ?????????????}??? ??????????}?? ???????}?? ????}?? }??
? ? ? ? ? 在上面的代碼中,能夠觸發怪物狀態發生變化的有兩個條件,第一,是玩家進入了怪物的警范圍,此時怪物將面向玩家奔跑靠近;第二,當前時間與怪物上一次思考的時間之差大于怪物的思考時間,此時,怪物將隨機作出反應。
? ? ? ? ? 好,下面我們回到游戲界面當中來。
? ? ? ? 如圖,博主事先從官方資源商店里下載了一個人物模型。在這個模型中,設計者已經為我們設計好了人物動畫,我們將這個模型拖放到場景中,調整到合適的位置,并將人物默認動畫設置為idle,下面我們將剛才寫好的腳本拖放到此模型上,并設置Hero為我們的玩家對象,在這里我們使用了官方提供的第三人稱角色控制器組件,最終實現的效果如下 :
? ? ? ?可以看到,在不同的時刻,怪物可以自己執行不同的狀態動作,當玩家靠近怪物的時候,會被敵人追擊,這就是今天的內容啦,謝謝大家!
轉載:原文出處
總結
以上是生活随笔為你收集整理的[Unity3D]Unity3D游戏开发之怪物AI的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。