偶遇Bug
笔者完成了序列帧播放模块,结果在测试时,第一次调用播放方法时没反应,第二次调用才播放。
BUG演示为了解决无法知道笔者何时点击了鼠标,不得不在方法体里面萌萌哒的输出这些话:
string[] msg = new string[3] { "第1次点击,居然不播放动画!", "第", "次点击,动画有播放~" };
Debug.Log(count == 0 ? msg[0] : (msg[1] + (count + 1) + msg[2]));
count++;
解决Bug
这是一个Bug,不能忍!
几经调试,问题终于找到了,就是这个[SerializeField]
搞的鬼!
来来,我们调试一下:
代码:
字段:
[SerializeField] Texture[] EmojFrame = null; //存储动画帧的Texture数组
方法体内:
EmojFrame = EmojFrame ?? EmojManager.GetInstance.GetExpTextureByModelName(model.name, index);
//上下2句代码是关联的,后面对象中的那个方法得到的是Texture数组
断点调试:
如上所示,这样导致了后续代码中的条件( 如下:)不能满足而不能实现序列帧的播放。
“0”会小于“0”?``IF``内的代码执行的了才叫真的怪事了总结:
本为了便于观察Texture
而列化了该数组,导致数组赋null
失效,可空合并运算首次运行无法为EmojFrame
数组赋值(Tips:??
是 可空合并运算符)最终导致了文章刚开始动画见到的现象。
躲坑:
- 如果字段在后续逻辑中会判断null,建议不要序列化该字段
- 如果一定要序列化,防止掉坑里,建议:
- 在start函数赋值null;
- 如果是数组这样的字段,逻辑中不判断null改为判断长度是否为0
标签:Unity3D、脚本编程、[SerializeField]、可空合并运算符
快捷访问:
网友评论