国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

用Unity蓋房子(三)——《勇者斗惡龍:建造者2》自動建造

2019-07-11 17:06 作者:皮皮關(guān)做游戲  | 我要投稿

作者:沈琰


前言

最后一篇文章,來把這個坑填完。

接上期:用Unity蓋房子(二)——《勇者斗惡龍:建造者2》地形生成和人物控制

上期內(nèi)容中搞定了無限地形的生成和建造功能的實現(xiàn),現(xiàn)在總算站在了實現(xiàn)最初設(shè)想功能的起點上,即讓AI按設(shè)計圖自動建造建筑。

先大致思考一下實現(xiàn)的步驟吧。

首先是設(shè)計圖的部分。不管是像原版一樣是放到背包里的道具還是說在場景中把待處理的方塊都顯示出來,設(shè)計圖從本質(zhì)上來說,都是一個數(shù)據(jù)的集合。其中存儲的是限定范圍內(nèi)的方塊數(shù)據(jù),而我們要做的事就是以鼠標(biāo)擊中的位置為基點,讓這些數(shù)據(jù)以我們預(yù)想的排列方式傳遞到chunk上。

其次是自動建造的AI。這里的主要難點就是如何在一個不斷變化的地形中正確尋路,以及多個AI協(xié)同工作的問題。

下面就以這個順序分別實現(xiàn)以上功能。

另外這期就盡量不貼代碼,只說思路。由于代碼會在實現(xiàn)過程中反復(fù)修改,直接貼的效果也不好,如果大家對實現(xiàn)方式有疑問,可以下載文章末尾的工程。

建造模式預(yù)覽

上期還留了一個坑忘了寫,這期就合并在一起說了,即建造時方塊的朝向控制。

之前我們用一個鏤空的框來表示當(dāng)前選中的位置,在刪除模式時看起來似乎還行,但在建造模式時是無法顯示當(dāng)前方塊的朝向的,因此在建造模式時直接把選中的方塊按類型以mesh的方式顯示出來,新建一個腳本來處理這個問題。

這個腳本的作用與chunk類似,都是根據(jù)數(shù)據(jù)生成mesh信息,所以這里面也需要對mesh的引用。不同的地方則是它可以旋轉(zhuǎn)朝向,旋轉(zhuǎn)的方式就是用的上一期說的自己寫的一個簡易四方向矩陣變換。因此方塊不是真的自己轉(zhuǎn)向了,而是方塊的每個頂點的相對位置變了。

然后材質(zhì)球就用和chunk一樣的,只不過稍微改一下shader,使其顯示為半透明。之前找材質(zhì)貼圖的時候特意找了一個能表示方向的,剛好能派上用場。

這還不算完,現(xiàn)在有個問題。朝向不同的方塊處于相鄰位置時對相鄰邊的隱藏判斷會出錯。

這是因為旋轉(zhuǎn)方塊的朝向是相對于方塊自己的朝向,而chunk中的相鄰邊檢測用的是相對于chunk的方向,因此這里在檢測是修正一下檢測方向就能解決問題。

設(shè)計圖模式預(yù)覽

現(xiàn)在把這個功能擴展到顯示一個指定區(qū)域內(nèi)。設(shè)計圖模式的功能大致能分成兩部分,一個是指定一個區(qū)域copy地形數(shù)據(jù)的復(fù)制功能,一個是根據(jù)指定區(qū)域位置去修改chunk數(shù)據(jù)的建造功能,即getData與setData的區(qū)別。

我的想法是,當(dāng)處于getData的模式時,用代碼生成一個預(yù)覽框顯示獲取數(shù)據(jù)的范圍,而在SetData的模式下除了這個預(yù)覽框,還要用半透明材質(zhì)生成mesh 顯示當(dāng)前的方塊數(shù)據(jù)。此外,不管是哪種模式,這個區(qū)域都是基于當(dāng)前鼠標(biāo)位置可旋轉(zhuǎn)的。

建造模式的旋轉(zhuǎn)方式

這個功能還是屬于PreviewBox這個腳本的功能范疇。為方便后面功能的實現(xiàn),我們先假設(shè)這個區(qū)域是一個正方體,這樣只需一個int值就能表示區(qū)域大小。后面的思路就是根據(jù)朝向來把這塊區(qū)域分成與cube大小相同的空間,找到它的起始點。然后以此為基點獲取所有的方塊中心點并存入數(shù)組中。

那么剩下的思路就清晰了,再新建一個byte數(shù)組來存儲方塊的數(shù)據(jù),接下來我們就需要保證坐標(biāo)數(shù)組和數(shù)據(jù)數(shù)組中的索引總是能正確地一一對應(yīng),并使用這些數(shù)據(jù)完成getData和setData功能。

復(fù)制功能

復(fù)制功能的預(yù)覽mesh用框不太好去設(shè)計紋理的樣式,原本想的是用鏤空的正方體框形來表示,由于在建造時方塊的數(shù)據(jù)預(yù)覽會與之疊加,為了不會遮擋方塊,這里選擇生成一個貼地的矩形面來表示區(qū)域的大小。還是根據(jù)坐標(biāo)計算出頂點,并傳遞數(shù)據(jù)到mesh中。

最后在unity商店里找了個帶邊緣輪廓的材質(zhì)作為其材質(zhì)球。

建造功能

有前面的基礎(chǔ),建造功能此時就只需加上其包含的方塊數(shù)據(jù)的預(yù)覽mesh,這個部分與chunk干的活類似,只有一點要注意,即剛才說到的保證坐標(biāo)數(shù)組的下標(biāo)與數(shù)據(jù)數(shù)組的下標(biāo)的對應(yīng)關(guān)系正確。

目前為止看起來都沒什么問題,接著就是實現(xiàn)數(shù)據(jù)的get和set功能。

然后試試效果,這個時候問題就來了。

朝向問題的修正

首先是setData模式時,方塊mesh預(yù)覽的隱藏面問題。有了之前的經(jīng)驗大概就能猜出問題出在哪了。顯然就是在旋轉(zhuǎn)預(yù)覽框時的相對朝向和方塊自己的朝向之間的問題。咱們先不慌修改,再看看其他問題。

可以看到除了預(yù)覽為初始朝向時,setData時的方塊朝向基本全錯了。這其實也好理解,當(dāng)我們在旋轉(zhuǎn)預(yù)覽區(qū)域時,可以看做是直接修改了方塊的絕對朝向。那么同理,getData時也要修正獲得的方塊數(shù)據(jù)的朝向。

都像chunk處理方塊相鄰方向那么去寫,代碼就顯得太難看了。因此干脆在朝向枚舉那里加兩個擴展方法去處理朝向修正問題。

然后在getData、setData和預(yù)覽mesh相鄰邊檢測時修正相對朝向。

修正之后一切都符合預(yù)期了。

chunk的第二個mesh組件

現(xiàn)在相當(dāng)于是直接把數(shù)據(jù)更新到chunk里,但我們要的只是起一個指示和預(yù)覽作用的mesh,最大的區(qū)別是它不該有碰撞。

所以在chunk的預(yù)制體下多加一個mesh,當(dāng)發(fā)現(xiàn)當(dāng)前的cube數(shù)據(jù)為透明時,就把數(shù)據(jù)傳遞到第二個mesh里。

AI的自動建造

接下來就是重點功能的實現(xiàn)了,這部分的核心就是尋路。

2D平面的尋路功能相信大家已經(jīng)不陌生了,如果有這部分不太熟悉的同學(xué),推薦去看專欄里的另一篇文章。傳送門:給貓看的游戲AI實戰(zhàn)(四)眼見為實——讓AI的思考過程可視化

但我們這里的尋路稍微有點不一樣,它不是平面的而是立體的。這里我們簡化一下思路,把方塊與方塊之間的連線作為路徑,那么地圖仍然可以看做是無向圖。估算一下規(guī)模,目前的默認(rèn)地圖為4x4個chunk,算上立體結(jié)構(gòu)節(jié)點也應(yīng)該不會超過1萬個,所以就用最簡單的廣度優(yōu)先搜索(BFS)就行。

新建一個腳本來編寫AI,定義一下尋路的規(guī)則。一圖流表示路徑規(guī)則:

把這個邏輯轉(zhuǎn)換為代碼:

然后根據(jù)判斷條件寫一個簡易的BFS,由于路徑不一定都有,所以還要處理當(dāng)尋不到路徑時的情況,這里的邏輯就是維護(hù)一個最近的節(jié)點,當(dāng)尋不到路時就返回這個最近點。

現(xiàn)在把這個腳本掛在主角身上,把路徑畫出來測試一下效果:

可以看到路徑?jīng)]問題,那接下來就是根據(jù)這個路徑走過去,把方塊擺到預(yù)覽的位置,然后切換到下一個,中間還要加上角色的動畫和移動過程。這部分沒什么難度,就跳過了,直接看效果。

多目標(biāo)協(xié)作

現(xiàn)在單個AI的功能沒問題了,來考慮多目標(biāo)協(xié)作的問題。最顯著的問題是NPC的建造會影響其它NPC的路徑。比如A在B的路徑上放了一個方塊,那么B的路徑就需要更新。

最簡單的辦法就是在每個AI放置方塊時,通知其它所有的AI路徑需要更新。

然后其它AI在運行時根據(jù)這個bool值去刷新自己的路徑:

最終得到的效果:

現(xiàn)在基本達(dá)到預(yù)期效果了,但還留下了兩個問題:

1.現(xiàn)在用了一個自定義的類型來管理路徑節(jié)點,當(dāng)AI較多時,同時更新路徑是生成節(jié)點過多,會產(chǎn)生較大的GC壓力。

2.當(dāng)AI處于移動中時無法更新路徑,導(dǎo)致有些時候AI看起來像是從方塊里走出來一樣。

這兩個問題就先留給大家思考一下,后續(xù)更新的我再來修改。

那么這個坑到這里就算是填完了,感謝大家觀看至此。

本期工程地址:https://github.com/tank1018702/CubeBuilder


有意向參與線下游戲開發(fā)學(xué)習(xí)的童鞋,歡迎訪問levelpp.com/。

用Unity蓋房子(三)——《勇者斗惡龍:建造者2》自動建造的評論 (共 條)

分享到微博請遵守國家法律
久治县| 兴山县| 桦甸市| 南木林县| 峡江县| 乐东| 延寿县| 黑山县| 夏邑县| 自治县| 凤阳县| 定结县| 乐清市| 邹平县| 达日县| 山阴县| 资阳市| 黎川县| 鹤壁市| 珲春市| 阿合奇县| 萨迦县| 阳朔县| 武乡县| 东明县| 安丘市| 扎鲁特旗| 东至县| 云和县| 九龙城区| 慈溪市| 登封市| 廊坊市| 米林县| 肥西县| 德江县| 富川| 鹤山市| 沾化县| 淳化县| 黄平县|