偶遇Bug
筆者完成了序列幀播放模塊蒸苇,結(jié)果在測試時,第一次調(diào)用播放方法時沒反應(yīng)哮洽,第二次調(diào)用才播放填渠。
為了解決無法知道筆者何時點擊了鼠標,不得不在方法體里面萌萌噠的輸出這些話:
string[] msg = new string[3] { "第1次點擊鸟辅,居然不播放動畫氛什!", "第", "次點擊,動畫有播放~" };
Debug.Log(count == 0 ? msg[0] : (msg[1] + (count + 1) + msg[2]));
count++;
解決Bug
這是一個Bug匪凉,不能忍枪眉!
幾經(jīng)調(diào)試,問題終于找到了再层,就是這個[SerializeField]
搞的鬼贸铜!
來來堡纬,我們調(diào)試一下:
代碼:
字段:
[SerializeField] Texture[] EmojFrame = null; //存儲動畫幀的Texture數(shù)組
方法體內(nèi):
EmojFrame = EmojFrame ?? EmojManager.GetInstance.GetExpTextureByModelName(model.name, index);
//上下2句代碼是關(guān)聯(lián)的,后面對象中的那個方法得到的是Texture數(shù)組
斷點調(diào)試:
如上所示蒿秦,這樣導(dǎo)致了后續(xù)代碼中的條件( 如下:)不能滿足而不能實現(xiàn)序列幀的播放烤镐。
總結(jié):
本為了便于觀察Texture
而列化了該數(shù)組棍鳖,導(dǎo)致數(shù)組賦null
失效炮叶,可空合并運算首次運行無法為EmojFrame
數(shù)組賦值(Tips:??
是 可空合并運算符)最終導(dǎo)致了文章剛開始動畫見到的現(xiàn)象。
躲坑:
- 如果字段在后續(xù)邏輯中會判斷null渡处,建議不要序列化該字段
- 如果一定要序列化镜悉,防止掉坑里,建議:
- 在start函數(shù)賦值null医瘫;
- 如果是數(shù)組這樣的字段侣肄,邏輯中不判斷null改為判斷長度是否為0
2019.03.07補充
隨著對unity序列化和反序列化機制的深入理解,這個問題也就能很好的理解和解釋啦醇份。
每一個場景稼锅,預(yù)制體都會反序列化到文件中。如果標記了序列化被芳,私有字段也會序列化到文件里面缰贝。反序列化的時候自然就會實例化這個字段并賦值了…
標簽:Unity3D、腳本編程畔濒、[SerializeField]剩晴、可空合并運算符
快捷訪問:
- Unity3D 如何設(shè)置CubeMap
- UGUI Button OnClick事件統(tǒng)一管理
- UGUI Slider onValueChanged事件統(tǒng)一管理
- UGUI Toggle onValueChanged事件統(tǒng)一管理
- Unity3D監(jiān)測按鍵輸入(快捷鍵)的有效方法
- Unity3D Editor模式下的System.IO數(shù)據(jù)訪問
- Unity3D 掛載的腳本取消勾選居然還會運行!侵状!
- Unity 代碼動態(tài)勾選或取消材質(zhì)球上的選項
- Unity SerializeField序列化字段導(dǎo)致Bug的跳坑筆記 ←您在這里