2012-04-27 99 views
4

如何爲遊戲製作強大的AI /腳本系統?遊戲AI - 行爲樹

1)對於所有NPC的/環境/實體,你是否給他們一個單獨的行爲樹(等等patrolBehavior,allyBehavior,vendorBehavior,doorBehavior)?如果屏幕上有500個單位,我應該對樹進行全面傳遞(從根 - >節點/動作)還是應該爲所有單元進行單節點進度?

2)我做了AI的邏輯在update()函數...但我聽到一些遊戲有自己獨立的AI線程,任何想法?

3)我想知道如何將我的遊戲分爲章節/章節......我是否使用一個簡單的變量(EVENT =「Mission 3」)來表示如何爲玩家做好準備,線性?然後在上面的樹中利用變量?

+4

這是一個非常寬泛的問題。如果您開始實施您的AI系統,或者開始閱讀[特定技術](http://www.aiwisdom.com/),然後返回具體的技術問題,您可能會得到更好的答案。 – 2012-04-27 20:36:40

+3

您還可以通過閱讀Source引擎AI系統的工作原理了解更多:https://developer.valvesoftware.com/wiki/Category:AI – 2012-04-27 20:51:35

回答

0
  1. 每個NPC/Agent都有自己的行爲樹。樹被更新並且'知道'哪裏可以繼續,所以效率通常相當好。
  2. AI可以在主線程中更新,它也可以在一個獨立的thead中更新。它取決於你,取決於你。
  3. 它取決於你自己。

behaviac是一個非常優秀的。

behaviac支持行爲樹,有限狀態機和分層任務網絡。行爲可以在設計者中設計和調試,由遊戲導出和執行。

C++版本適用於客戶端和服務器端。

而且,它是開源的!

6

我會盡力回答你的問題。

  1. 我在例如一個靜態類的所有分支邏輯和行爲樹:

    public static class Behavior 
    { 
        //Branch 
        public static Action Selector(Func<bool> cond, Action ifTrue, Action ifFalse) { 
         return() => { if (cond()) { ifTrue(); } else { ifFalse(); } }; 
         } 
        public static Action Sequencer(Action a, Action b) { 
          return() => { a(); b(); } 
         } 
    
        //Example trees 
        public static Func<bool> ifPlayerIsInSight =() => { return true; /*...true iff WorldState shows guard can see player...*/}; 
    
        public static Action shootAtPlayer =() => { /*...aim guard's weapon at player and fire...*/ }; 
    
        public static Func<bool> ifUnderFire =() => { return true; /*...true iff WorldState shows guard hears player gunfire...*/}; 
    
        public static Action takeCover =() => { /*...guard runs for nearest shelter... */}; 
    
        public static Action walkBackAndForthGuardingDoorway =() => { /*...default guard patrol behaviour...*/ }; 
    
        public static Action patrollingGuardBehaviour = 
         Selector(Behavior.ifPlayerIsInSight, Behavior.shootAtPlayer, 
         Selector(Behavior.ifUnderFire, Behavior.takeCover, 
          Behavior.walkBackAndForthGuardingDoorway)); 
    } 
    
    1. 做在LateUpdate()或持續,因此不會滯後於主循環。

    2. 這取決於你。您可以在每個行爲樹中實施「狀態」或將其分開並管理在什麼時間使用哪個。

+0

我回答了您的問題嗎? – 2012-06-07 06:03:01