2020年1月1日 星期三

Unity筆記:單位採集AI系統。


說到AI感覺都很複雜的樣子,
不過好的AI應該是愈簡單有效愈好,
這點對有幾百個單位的小地圖王國這種遊戲為了效能優化上尤其重要,
Unity到目前也還沒有真正的2d尋路支援,
但是,用地塊和字典還是能簡單的做出有效的單位自動尋路系統,
讓我簡單演示一下:


 public Vector2 漫遊位置(Vector2 輸入值, bool 是否需要指定地塊, string[] 指定地塊名列表)
    {
        Vector2 回傳值 = new Vector2();

        回傳值 = 輸入值 + new Vector2(Random.Range(-3, 4), Random.Range(-3, 4));

        bool 是否結束重新尋找地塊 = false;

        if (是否需要指定地塊)
        {
            for (int i = 0; i < 指定地塊名列表.Length; i++)
            {
                if(玩家.地塊位置對應地塊名字[轉換地塊位置為文字(回傳值.x, 回傳值.y)] == 指定地塊名列表[i])
                {
                    是否結束重新尋找地塊= true;
                }
            }

            if(是否結束重新尋找地塊 == false && Random.Range(1, 40) != 1)
            {
                回傳值 = 漫遊位置(輸入值, 是否需要指定地塊, 指定地塊名列表);
            }
        }

        return 回傳值;
    }


首先單位會傳入自己的位置,
目標是回傳一個附近的資源點,
之後再由單位自己移動到那個資源點,

單位傳入位置後,會有一個是否值來決定要不要尋找資源,
一些負責防禦的單位譬如劍士之類的就不需要了,
但農夫、打水工、伐木工和礦工這類的就會希望他們自己去找附近還有的資源,
否則可能還會卡在護城河之類的地方,
其他像是學者、商人和教士,
也能做成會去尋找有道路跟建築的地方,
(也只能在城市中產生資源),
來達成都市化的目標,

有了這個是否值後,
我們再傳入一個目標的地塊列表,
因為有些單位不會只想要找一種地塊,
譬如工人,除了負責採收食物外,
還需要幫忙礦工挖砂子找礦物,
所以就要傳入農地、綠地、沙地,三種地塊名稱,
傳入後他就會判定回傳的位置是否為這三種地的其中一種,
如果都不是,就回頭再弄一個新的位置出來,

細節上這個代碼是找附近6*6的位置,
重複判定用了個隨機值1~39,
這不是好的寫法,但增加點隨機性也完整遍歷完附近的地塊也不錯,
尤其實際遊戲中,
單位畢竟會待在資源點附近,
所以也不用太擔心他跑到其他地方,
如果真的沒有找到他就會走到原本的目標去,
下一次找的時候又會有新的6*6土地可以去跑了,

雖然只是少少的幾行程式,
但加進遊戲後效果很好啊,
至少工人不再是無腦的亂走了,
建設資源區之類的也明顯有了回饋,
寫出AI系統的感覺真棒。
(〃∀〃)ゞ

沒有留言:

張貼留言

你發現了這篇網誌的留言板,在這留點什麼吧|д・)