【Unity3D】Unity3D開發《我的世界》之七、番外篇


轉載請注明出處:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_07.html

 

本來上一篇就結束了,但是有小伙伴私信我覺得還差了很多重要的內容,比如方塊如何構成了自然的地形,液體是如何流動,光照如何實現,以及紅石電路,沒有這些還怎么叫《我的世界》呢?

那這一篇就給大家一點啟發,沒有代碼,只有思路(對於想真心鑽研的人來講應該夠了)。

 

一、自然地形的生成

首先使用柏林噪音生成起伏的山脈,就跟我們前面生成的一樣。

然后生成生態。

《我的世界》里的生態主要使用維諾圖(Voronoi Diagram)算法來生成。

生成完生態就來生成自然的地形了,每一塊區域都經過一層層地處理,放大縮小邊緣過度等等處理之后,就生成了美麗的自然風景。

具體可以看這里詳細分析了《我的世界》的源碼 http://blog.csdn.net/xfgryujk/article/details/61915888 總共七章

 

二、液體的流動

玩過《我的世界》的人應該都是很喜歡它的液體系統的,水流的用處非常廣泛,除了可以做成水簾裝飾,還可以做自動收割機,圓石生成機等等。

我們之所以覺得這個水是一個難點,是因為我們固定的思維,認為水的主體方塊跟它旁邊流下去的水流是一體的,所以我們百思不得其解,覺得它的實現難度非常高(反正我真的沒想到如果是一體的該怎么實現)。

然后呢,其實換一種思維,它不是一體的,它就像樹苗一樣。水的主體方塊是樹苗,樹苗會變成大樹,變成大樹的過程不就是改變周圍的方塊嗎?比如把原來的空氣方塊替換成了樹干方塊。

這么一想,是不是覺得非常簡單?

我們只需要做幾個水流的子體,然后用一個攜程來處理任何一個被放置或銷毀的方塊周圍的水方塊,然后遞歸地生成一一對應的子體。

當然這里是一個簡單的示例,它還有很多其他的各種子體,而且子體和子體相遇時應該怎么處理也需要靈活處理。

比如假設這里檢測到,水四級子體的下一個Block是岩漿的三級子體,那么這里應該生成一個圓石。

 

三、紅石電路

看了上面水的生成,你應該有點想法了吧?沒錯,差不多的,檢測紅石信號源周圍的方塊是不是紅石電路,然后依次改變方塊(或者方塊的狀態)。

 

四、光照

光照是其中最最最最最復雜的,它用到了Unity3D、數學、物理等學科非常多的知識,實現難度很大很大。

 

它的實現方式可以直接看知乎這個話題中王遠的回答 https://www.zhihu.com/question/24459078

還有它的百科,中文的,一定要看 https://minecraft-zh.gamepedia.com/index.php?title=%E4%BA%AE%E5%BA%A6&variant=zh

然后自己先做2D的來試試看,慢慢研究,一步一步來實現。實在實現不了就放棄吧。

 

五、面數優化

在我的世界里,Y軸上只有一個Chunk,但是我們的不一樣,我們的Y軸上還分為16個Chunk。

這么做其實不好,多增加了一層循環,在存儲和網絡傳輸的時候也會增加消耗,但是因為Unity3D在2017.3版本以前一個物體最多只能有65k個面,所以只能這樣實現。

現在好了,從Unity3D2017.3版本開始,如果一個物體的面如果超過65k,就會交由32位對象來存儲,這樣最多就能存儲4226k的面,Y軸只有一個Chunk也綽綽有余~

具體的代碼我還沒實現,有興趣的自己優化一下,應該是很簡單的~

 

完結,散花


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM