ETH官方钱包

前往
大廳
主題

【Unity / C#】仿製Tile Mesh系統,自動Mesh擴張、簡易Editor、Texture Apply優化、取樣貼圖伸縮大小

%%鼠 拒收病婿 | 2021-08-24 17:51:33 | 巴幣 228 | 人氣 789

前言:
上一個的改良優化版,主要是改成mesh後就不用生成上千個gameObject,雖然在算tile位置比較麻煩一些。
目前還沒做Save/Load功能、以及之後希望能做像Unity Terrain一樣多Texture Paint功能!!
((期待一下吧  >///<
Demo:

今天剛簡報完,所以就把內容拿來用~

Tile邊緣判斷
若要畫打勾的地方,則會以該tile為中心,從左上至右下的順序檢查,狀況用長度8的二進位值表示,每個值都會對應到一個情況的圖形。沒有被畫到的tile就不用改圖片。


圖片種
共16組圖(參考),考慮旋轉的話共47組變化。
例、Fill圖對應的數值有那些,每個數值都對應著不同的Tile擺放情況。



做成Mesh
一個Mesh就能容納上百上千的tile。
(影片裡面有邊緣偵測錯誤的問題,下面會解決)


自動擴張Mesh
發想來源:之前用Unity Terrain Paint工具,發現畫超出範圍就會自動擴張一個新的Mesh。
在Demo中,Draw是由按住滑鼠時觸發,傳入滑鼠所在的世界座標。
很單純,若沒有mesh範圍包含該點,則產生新的Mesh


Tile Size、Texture Size、Mesh Size
(日文字不用管,沒什麼重點www)

例、原本的tile圖檔是256*256px,但為了符合程式設定的64*64px,會先經過取樣壓縮成該大小。一開始都先把數值定為常數、先著手各size的轉換,之後只要輕鬆改數值就能改變各物件的大小,去找出最好的優化數值。

Texture2D.GetPixelBilinear:像是uv座標一樣範圍0~1。

取得Tile的方法:
從滑鼠點的世界座標得到該點的tile:
先找到該點所屬範圍的MapMesh(自訂類型,一個mesh由一個mapMesh控制),在從此mesh去找tile。

轉成tile的local座標:

最基本,用vector換算成index。
x、yTileCount是x、y的邊長,雖然tile是正方形的所以兩個會相等。


跨Mesh邊緣檢測:
(破日文)
(實際上tile座標是由左下開始,不是從中心開始,只是這樣比較好簡報)

先設定九宮格的位移座標:
再來轉成tile世界座標就能跨mesh得到tile,方法定義好後,使用起來就跟在同個mesh上處理一樣。



Texture.Apply()優化:
Texture.Apply()是很吃資源的,像上面講到的,畫一個tile就要檢查9*9個tile,不能每檢查一個就apply一次。因此我做個buffer來存放每次tile檢查的結果,等到全部檢查完再一次套用貼圖。

因為跨mesh的判斷可能需要更新到多個mesh的貼圖,所以最慘的狀況是要apply四張mesh的貼圖。




EditorWindow:
更詳細的可以看之前做GraphView的筆記
主要是想貼Scene轉成世界座標的做法:
簡體字註解是因為不知道在哪裡搜到的方法。

後紀:
裡面還有些bug,或功能不夠完整,之後再更新。

另外最近比較忙,專題老師找了跟遊戲領域沒有關聯,但我覺得很酷又可以很深的領域。
老師也給了我幾張paper跟建議套件讓我先學一下。主要是資料結構、大數據分析之類的。

最近會比較專心在工作、競賽專案與專題領域,遊戲的成分會比較少,但期望之後能用這個系統做個小經營遊戲。



送禮物贊助創作者 !
0
留言

創作回應

KK
好酷!你要忙的東西還真多,能找到自己的平衡最重要!加油加油[e19]
2021-08-24 18:07:53
%%鼠 拒收病婿
謝謝!! 想嘗試T型發展,加油加油
2021-08-24 18:15:42
追蹤 創作集

作者相關創作

更多創作