上一個的改良優化版,主要是改成mesh後就不用生成上千個gameObject,雖然在算tile位置比較麻煩一些。目前還沒做Save/Load功能、以及之後希望能做像Unity Terrain一樣多Texture Paint功能!!((期待一下吧 >///<Demo:
今天剛簡報完,所以就把內容拿來用~
若要畫打勾的地方,則會以該tile為中心,從左上至右下的順序檢查,狀況用長度8的二進位值表示,每個值都會對應到一個情況的圖形。沒有被畫到的tile就不用改圖片。
圖片種類:
共16組圖(參考),考慮旋轉的話共47組變化。例、Fill圖對應的數值有那些,每個數值都對應著不同的Tile擺放情況。
一個Mesh就能容納上百上千的tile。
(影片裡面有邊緣偵測錯誤的問題,下面會解決)
發想來源:之前用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:
先找到該點所屬範圍的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跟建議套件讓我先學一下。主要是資料結構、大數據分析之類的。最近會比較專心在工作、競賽專案與專題領域,遊戲的成分會比較少,但期望之後能用這個系統做個小經營遊戲。