unity 地图画格_[蛮牛译馆]UnityC#教程—六边形地图系列之创建网格(中)
原標題:[蠻牛譯館]UnityC#教程—六邊形地圖系列之創建網格(中)
書接上回
3. 渲染六邊形
單元格都正確擺放了,我們可以開始著手陳列真正的六邊形了。我們首先必須擺脫那些plane,所以從單元格prefab里移除除HexCell外的所有組件。
就像Mesh Basics教程中一樣,我們使用一個簡單的mesh來渲染整個網格。不過,這次我們不會預先決定有多少個頂點和三角形。取而代之,我們使用列表。
創建一個新的HexMesh組件來管理我們的mesh。它需要一個mesh過濾器和渲染器,有一個mesh,并有存有其頂點和三角形的列表。
為我們的網格創建一個帶有該組件的字物體對象。它將自動獲取一個mesh渲染器,但不會被分配材質。所以添加一個默認材質。
HexGrid如何找回它的hexmesh,就同它找到自己的畫布一樣。
網格被喚醒后,必須高速mesh來三角化它的單元格。我們必須事先確定hex mesh組件也已經被喚醒。猶豫Start稍后會被喚醒,所以寫在它里面。
這個HexMesh.Triangulate方法將可在任何時刻被調用,甚至當單元格已經被三角化后。所以我們應該清理舊數據。然后在所有單元格循環,分別將其三角化。這之后,將產生的頂點和三角形注冊到mesh中,以重新計算mesh發現來結束。
由于六邊形是有三角形構成的,讓我們創建一個簡便的方法來添加一個三角形,給予三個頂點坐標。它簡單地按順序加上了頂點,同時還添加了這些頂點的指數來組成一個三角形。第一個頂點的指數等于定點列表在加入新頂點前的長度。所以在添加前記下它。
現在我們可以三角化單元格了。先從第一個三角形著手。它的第一個頂點是六邊形的中心。另兩個頂點是第一和第二個叫,與其中心關聯。
成功了,那么循環六個三角形。
不能共享頂點嗎?
不幸的是,產生了一個IndexOutOfRangeException。這是由于最后一個三角形試著去取第七個角,那個不存在的角。當然,它應該回卷去使用第一個角。或者,我們可以在HexMetrics.corners中復制第一個角,那樣我們就不需要擔心這個問題了。
六邊形的坐標
再在六邊形網格環境下看看單元格坐標。Z坐標顯示正常,但是X坐標是曲折的。這是一種使我們的行偏移來覆蓋矩形區域的副作用。
這些偏移坐標在與六邊形相關時并不好處理。添加一個HexCoordinates結構,我們可以用它來轉換成一個不同的坐標系統。將其序列化以使Unity能夠儲存它,從而允許他們在play mode中存活。同樣,使用public只讀屬性使它們不可變。
添加一個靜態方法來創建一系列使用常規便宜坐標的坐標。就現在,先逐字復制這些坐標好了。
同樣添加方便的字符串轉換方法。默認ToString方法會返回結構類型名,并不實用。覆寫并在一行里返回坐標。同時添加一個方法來將不同坐標置于不同的行,因為我們已經在使用這樣一種布局了。
現在我們可以為我們的HexCell組件添加一系列的坐標了。
矯正HexGrid.CreateCel來使它從新坐標中受益。
現在來解決X坐標的問題,使它們沿一條直的軸對齊。我們可以通過取消水平位移來做到。結果就是典型的軸向坐標。
這個二維坐標系統然我們用四個方向來描述運動和偏移。盡管如此,剩下的兩個方向還需特殊處理。這顯示出還有第三個維度。確實,如果我們水平翻轉X唯獨,我們就得到了消失的Y維度。
由于X和Y維度互為鏡像,Z維度恒定的情況下一起添加它們的坐標總會產生相同的結果。事實上,如果你一起添加三個維度的坐標將會得到0。如果增加一個坐標,你將必須增加另一個。確實,這產生了6個可能的運動方向。這些坐標是立方體坐標,有由于它們是三維的,且拓撲學上也像一個立方體。
由于所有坐標疊加后為零,你總是可以通過另兩維坐標導出剩下的一個由于我們總是存儲X和Z坐標,那么我們就不需要再存儲Y坐標了。我們可以囊括一個使用字符串方法能夠將其推導出的屬性。
監視器里的坐標
在play mode選中一個單元格。由于它顯示,inspector不會顯示它的坐標。只有HexCell.coordinates的前端標簽被展示。
不過這不太重要,只是在坐標被顯示時會顯得更整齊。Unity通常不顯示坐標是因為它們沒被標記為序列化域。實現它,我們必須為X和Z明確定義序列化域。
X和Z坐標現在已被顯示了,但是它們是可編輯的,而這是我們不需要的,因為坐標應該恒定。而且它們重疊著顯示也是不太美觀的。
我們可以通過為HexCoordinates類定義一個自定義屬性來更好實現。創建一個HexCoordinatesDrawer腳本,將其置于Editor文件夾內作為僅供編輯器使用的腳本。
此類應該繼承UnityEditor.PropertyDrawer并且需要UnityEditor.CustomPropertyDrawer屬性來使它與正確的類關聯。
Propertydrawer通過OnGUI方法渲染它們的內容。這一方法用提供屏幕矩形區域繪制,序列化數據和它屬于的區域的標簽。
從屬性中提取x和z值并使用它們新的一系列的坐標。然后在特定位置繪制GUI標簽,使用我們的HexCoordinates.ToString方法。
這顯示了我們的坐標,但是現在字段名字不見了。這些名字通常由EditorGUI.PrefixLabel方法繪制。作為附加,它會返回一個與調整后的矩形,它與標簽右側對齊。
拓展閱讀: UnityC#教程—六邊形地圖系列之創建網格(上)返回搜狐,查看更多
責任編輯:
總結
以上是生活随笔為你收集整理的unity 地图画格_[蛮牛译馆]UnityC#教程—六边形地图系列之创建网格(中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux文件默认权限和umask笔记
- 下一篇: mybatis字符串转成数字_Pytho