前往
大廳
主題

【遊戲開發日誌 #9】狗才更新 Unity,馬的

サンエックス | 2021-06-19 19:19:01 | 巴幣 3644 | 人氣 580


繼上篇文發完後,正在開發一項功能,需要用到列舉 (System.Enum) 泛型條件約束
然而這功能於 C# 至少需要 7.3 版本以上。

當初 PC 裡安裝的 Unity 版本是 2018.2.8f1,
Google 了一下得知,我的 Unity 似乎無法對應支援 C# 7.X 以上版本,想想也是該更新 Unity 了。

專案備份完之後,首先是更新到 2020 LTS,結果變成 Visual Studio 無法正常獲取專案內容,甚至還有幾個重要的 Script 無法取得正常參照,東改西改最後是選擇作罷。
以前就聽人說過沒事不用刻意去更新 Unity,大量報錯根本是日常,這次切身體會到了。

折衷後,改為更新成 2019 LTS,總算沒有上面的問題,
雖然還是有上百條警告跟部分錯誤,不過都還是在能修復的範圍內。

修完後發現角色在地形的移動上,出現了起伏不定的問題,
弄了半天才知道,Composite Collider 2D 多了一個 Edge Radius 欄位,這會讓碰撞體邊緣周圍多出對應半徑值的大小,是這次問題的元兇。

我專案中全被設為了 0.1 左右的值,官方文檔表示該值預設是零 ???
又花了不少時間把所有地形物件都處理過一遍,謝謝 Unity。

其他的就是順便把一些舊的插件更新,清理不需要的產物等,
來回弄了快兩星期,整個更新作業才算是大功告成,結果發現專案相比更新前肥了200多MB。
好處是,總算能切換成深色主題,編輯器的字體對中文的顯示也友善多了。

Δ 更新前/後


◆【列舉項目清單】
在能夠實現列舉泛型條件約束後,主要想開發的就是這個項目。
其主要流程功能如下 (用當前專案中的粒子樣式庫作為範例):

(1) 指定一列舉類型

(2) 將可用的列舉項目,對應轉換成指定架構欄位,並以清單形式陳列於編輯器。
清單的元素數量,將會自動隨該列舉的內容而有所變化
Δ 每個項目的預設名稱格式為「[該列舉的值] 自訂名稱 (該列舉原名)」

(3) 自動生成索引,能以該列舉值為 Key,取得其對應的 Value。
Δ 透過它可取得上圖 (2) 中,「擊倒粒子 - 預設」的粒子物件。

(4) 將需要該列舉值的欄位,在編輯器上使用自訂名稱以下拉式選單來呈現,提高辨讀性。
∇ 預設的列舉賦值欄位 ∇ 自訂名稱版

配合上單例ScriptObject 後,不只上述的粒子樣式庫,
幾乎所有能透過列舉項目來實現的資料庫,都能使用該功能。

繼下文


◆【音訊事件庫】
舊版音訊庫的翻修,以前的版本播放音訊還只是用一個整數變量來充當 ID 用,
沒有相互對照的話,只看 ID 根本不清楚它能播放出什麼聲音來。

每個音訊可由數個音效來組成,包含其各個參數,
該事件庫在測試期間,能使用自訂名稱旁的 "Play" 按鈕來直接測試該音訊事件的播放結果。

此外,也能透過每個事件的屬性來篩選想要的音訊種類,
像是背景音樂、環境音效或是系統音效等,而非把整個音訊庫陳列出來。

Δ 以 BGM 作為條件篩選

◆【動畫事件庫】
動畫播放就屬我當初接觸 Unity 第一個處理的東西了,
回去翻以前的程式碼,完全就是黑歷史,所以這次是整個砍掉重練。

以往的動畫物件是製作成一個個的 Prefab,到場景播放完後再回收,
現階段的版本中,只要設置其動畫片段和參數,就會使用專屬的控管器根基物件來達成。
每個動畫事件也能有複數個項目來組成,甚至是生成其他動畫事件,進而形成一套 "動畫組"。

動畫物件還額外加了獨立TimeScale 屬性,
而在動畫事件的處理上,生成與被生成者彼此有親子物件關係,
可以想像成物件在 Hierarchy 上的樣子,只是不會顯示出來。
而該獨立 TimeScale 也會影響到子項動畫上,
比方說上層的動畫本身被設為 0.5 倍速,其下層動畫本身也設為 0.5 倍,
則那個下層動畫實際播放出來的速度即為 0.25 倍。

整理動畫效果期間,發現以前國外論壇找的負片 Shader 有瑕疵,
在物件 scale 任一軸為負數時,會無法正常顯示。
Shader 這塊我不是很熟,加上上述的問題也不太容易 Google 的樣子,
想了想之後,就決定自己嘗試弄了個新的出來看看。

Δ 原版/自己試著弄的

兩者使用的是同張貼圖、動畫片段,只有材質上的差異,
感覺自己弄的變得簡潔些,但至少沒顯示上的問題了。


◆【排序圖層統整】
主要是對 SpriteRenderer 的 Sorting Layer 做出有規劃性的整理,並製作成項目表。
2D 遊戲於圖層級別的優先順序管理應是相當重要的部份,大學期間感覺有很多人都忽略了這一塊,背景意外蓋過角色的狀況也是司空見慣。

Δ [預設值] 圖層名稱 (允許值範圍)

◆【物件池改良】
設計模式常見到不用多提的東西,當初沒時間寫所以用免費插件墊著的。
先前版本中,從物件池取得物件時,將取得對應對象的 GameObject 參照,不過通常會需要替該物件的某些 Component 做出調整。
比如:
從物件池中取得一角色,需要設置其初始 HP 為上限的 50%,則需要取得其角色參數的專屬 Component,得用到 GetComponent<>() 方法。
但對於物件池來說,針對就是會頻繁地反覆取用的物件,每次取出角色時都要用到 GetComponent<>() 的話,長期下來對於效能來說也是一筆開銷。

而改良後,能夠在物件池初始化階段指定對應的 Component 類型,並將其參照儲存於池中物件專屬元件中的變量上。
從物件池中取得物件時,得到的參照即為該專屬元件若需要初始化時指定的 Component,只要直接取得該變量即可。



總結下來,在搞版本更新上自討苦吃佔走快兩星期,
也幸好能夠恢復開發作業,差不多該回去繼續弄角色系統了。

先醬

創作回應

樂小呈
怕,各種超強系統[e15]
2021-06-19 19:31:17
サンエックス

https://truth.bahamut.com.tw/s01/202106/995e9b79ba432c022f7c1e6ae9da8c3d.JPG
2021-06-20 04:04:26
在意你就輸了
特效好讚,請問怎麼做的@@
2021-06-19 20:53:00
サンエックス
逐格繪製哦,隨後再放進 Unity 裡上後製跟粒子特效 [e23]
2021-06-20 04:04:43
サンエックス
這特效快3年前畫的了,小屋裡有篇繪圖創作是把各元素拆解出來獨立循環的
2021-06-20 04:05:11
派大星
這Editor有點厲害[e22]
2021-06-19 21:44:52
サンエックス
寫起來也很費時就是,不過還是以使用上的便利為宗旨 [e19]
2021-06-20 04:05:36
joLoo 走鹿
GIF超帥!!
2021-06-19 21:52:21
サンエックス

https://truth.bahamut.com.tw/s01/202106/20cb471a0fd9a1c9da14b70fe6efdc4e.JPG
2021-06-20 04:05:54

更多創作