把標題標籤改回兩個字,四個會太長
音效度的音效,稍微幫遊戲裡的小遊戲做了音效。從音效素材庫裡找了一些資源,然後用 Audacity 微調。但畢竟不熟這部份,所以才做出四五個音效就花了好幾天
素材庫
https://freesound.org/小遊戲裡的資料夾拾取,我找了一個滋滋聲的音效微調,然後資料夾出現就是把它反過來播ww
還有攻擊的警告,我拿 UI 選取的音效去調,把音調什麼的改低,讓它聽起來更像警告音。攻擊的磁磚碎裂,我找了東西打破的聲音,配上打擊聲混和之後的效果蠻ㄅ錯的。
磁磚碎裂,編輯過程的圖沒截到,輸出就壓成單音軌了。
小遊戲的音效
然後爆音也是音效常發生的事情,如果相同波形的音效同一時間疊了好幾個,音量就會變超級大。為了修這點,我直接限制讓每種音效只能在一幀內播出一個,避免疊加爆音。
透過令牌物件的模板,添加一個物件啟用檢測的虛擬函式,讓繼承的令牌能夠複寫自己的檢測。至於音效就是透過計時的方式檢測這幀是不是播過了而已
無法預料的惡性 BUG前幾篇的日誌應該有說到我利用 ScriptableObject 令牌做各種資源管理,音效、物件池和文本翻譯等等的。
其實在開始這種作法的時候,我就有遇到一些惡性 bug,像是文本未初始化把整個遊戲癱瘓之類的...我那時以為是執行順序的問題,所以只加了一些防呆,感覺修好後就沒再注意了
直到上次的 Build,測試那邊一直發生遊戲無法進行的狀況,回報了一些狀況,我就開始疑惑了,因為有時是從文本觸發、有時又是音效那裡出問題,修一個另一個又出問題。不是架構耦合導致的,兩者完全沒交互到,但就是一下好一下壞,所以我超疑惑的 D:
還好找到一個容易重現的觸發方法,清除資料後進入遊戲 > 進入戰鬥 > 退出戰鬥 > 裝備界面 > 升級裝備。點擊升級裝備時,按鈕的音效沒有正常播放,導致後續裝備相關的檢測沒有完成,導致裝備升級超出上限,再導致轉場時寫入裝備效果的 Index Out Of Array,讓戰鬥場景遊戲初始化未正確執行完畢,讓遊戲癱瘓。
好吧,至少範圍縮小了,某個音效出了問題導致一連串的 bug 連鎖,於是我就開始找音效出了什麼問題。後來測好幾次才發現是 ScriptableObject 那裡有特定令牌會發生未被初始化的問題,於是我就去讓令牌在初始化的時候 print 一下資料檢查...不對阿,明明出問題的那個令牌是有正確初始化的 why D:
後來再繼續測才注意到,不是令牌沒被初始化,而是有
特定 ScriptableObject 的暫存資料會在「某些情況下」遺失。於是我選著那個一直出問題的令牌,想說看看資料遺失的當下是怎麼情況的。
...然後這個 bug 就停止了,
這 bug 只會在我沒有看著物件的時候發生。
蛤???這三小薛丁格的 BUG
頭痛,Build 好幾次,改了好幾總作法,像把 Func 改成對整個音效池的引用之類的,都只會讓問題暫時消失,但一段時間後還是會隨機發生資料遺失的狀況,結果令牌壞掉 > 搞壞其他東西 > 搞壞整個遊戲。
e04 連觸發原因都找不出來是要怎麼修,這是我學 Unity 以來遇過的最詭異 bug
後來再再再再花了不少時間找,從算找到正確的關鍵字查出資料了
ScriptableObjects losing data randomly Scriptable Object resets randomly between scenes 導致資料遺失的原因是 Unity 自己做的釋放工作,
Unity 會自動釋放一些他認為沒有被使用到的資源。阿剛好我的令牌物件是僅存在資料夾裡的,我沒有讓執行初始化的 manager 儲存他們,只會由使用到令牌的對象除存引用而已。所以有些暫時沒使用的音效就在轉場時釋放,
導致 ScriptableObjects 被初始化為原始狀態,結果就是我在 runTime 寫入的暫存資料遺失。
嘗試了幾種資料中看到的修法。
1. 把暫存變數添加 [SerializeField] > 無效
2. 把暫存變數添加添加 [Serializable] > 無效
3. 把暫存變數添加添加 [NonSerialized] > 無效
4. 把令牌的 hideFlags 設置為 HideFlags.DontUnloadUnusedAsset > 短時間內不會產生問題,但一段時間後還是會發生,無效
5. 讓 dont destroy 的場景物件儲存對 ScriptableObject 的引用 > 有效,如果有場景引用的話就不會被釋放。
最後我還是用 dont destroy 的方式來修,Bug 風雲告一段落
但是是好糟糕的作法,求大佬提供更好的方法 QQ
就醬,看是明天還後天來篇閒聊
昨天寫到一半太累就先休息ㄌ,所以才在這個奇怪的時間發
是我的錯覺還是新版文章的推薦欄裡不會出現舊版的創作
阿捏母湯ㄡ