創作內容

19 GP

【專案】山鴉行動 音效和無法預料的惡性 BUG 11/2

作者:樂小呈│2021-11-02 12:14:32│巴幣:49│人氣:327
把標題標籤改回兩個字,四個會太長

音效
度的音效,稍微幫遊戲裡的小遊戲做了音效。從音效素材庫裡找了一些資源,然後用 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

就醬,看是明天還後天來篇閒聊
昨天寫到一半太累就先休息ㄌ,所以才在這個奇怪的時間發


是我的錯覺還是新版文章的推薦欄裡不會出現舊版的創作
阿捏母湯ㄡ
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=5305804
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:Unity|遊戲開發|山鴉行動

留言共 1 篇留言

多古尼爾拉布拉布拉格
看到一半的時候我就想說一定是GC搞得鬼
看到後面 果然是類似GC的東西在搞鬼
這種東西真的又愛又恨
沒有他們就要自己去釋放
有的話有時候就很容易有東西被放掉
不過你好厲害 我雖然可能猜出大概是什麼
不過我常常會找不到答案
英文太爛ㄌ

11-02 12:54

樂小呈
找半天 bug 結果不是我程式沒寫好[e8]11-02 13:24
樂小呈
還好拉,就是自學查習慣了,我英文也還蠻...痾是很差,只是知道怎麼找關鍵字而已11-02 13:24
我要留言提醒:您尚未登入,請先登入再留言

19喜歡★angus945 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:[達人專欄] 【學習日誌... 後一篇:【閒聊】為什麼考試要有時...

追蹤私訊切換新版閱覽

作品資料夾

a86189642祝福
看到的人會變得幸福哦!看更多我要大聲說5小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】