常见问题
1160字约4分钟
2024-03-02
版权声明
本节所使用的模型来自手游《碧蓝航线》,其中:
“安克雷奇的换装‘海豚、海洋、游泳课’”模型仅作为修复示例,不会预置在App中,
版权归原作者所有,若认为侵权请通过官网的【更多】->【社交媒体】或App中的【关于】->【意见反馈】中联系开发者。
Q:点击动作列表中的动作发生闪退,如何解决?
注
接下来的问题复现以及修复过程均以手游《碧蓝航线》中安克雷奇的换装“海豚、海洋、游泳课”为例。
示例用到的模型文件结构如下:
- motions
- complete.motion3.json
- effect.motion3.json
- home.motion3.json
- (共16个动作json文件)...
- textures
- texture_00.png
- ankeleiqi_2.moc3
- ankeleiqi_2.model3.json
- ankeleiqi_2.physics3.json
模型正确性验证
在电脑端使用Live2D Cubism Viewer 4.2,双击ankeleiqi_2.moc3
查看模型,发现能够正常打开;播放motions
文件夹下的动作complete.motion3.json
,发现可以正常播放动作,说明模型本身应该是没有问题的。

问题复现
将模型导入到萌译,点击动作列表中相同的动作complete.motion3.json
,萌译发生闪退。
是不是萌译的Live 2D代码出现了问题?
是这样也不是这样。萌译的Live 2D功能使用了Live 2D SDK,这一部分的代码并不是萌译的开发者写的;在发现该问题并进行排查时,开发者也将安克雷奇的皮肤移植到了官方的安卓Sample中进行测试,同样出现了闪退的问题。

问题排查
下面是对问题进行排查的过程,有一定的编程能力要求,读者感兴趣的话可以继续阅读,也可直接跳转到解决方案。
将手机连接Android Studio,打开Logcat,在切换到安克雷奇的换装时,注意到SDK的报错如下所示。

对报错信息和函数调用进行追踪,发现错误出现在Live 2D SDK的Framework中。

结合该函数以及报错信息Index xxxx out of bounds for length xxxx
,不难发现是在加载动作时出现了长度越界问题。
由于开发者并不是Live 2D的从业人员,Live 2D的SDK也并非完全开源,因此并不清楚Live 2D SDK内部是如何处理动作的json文件的。目前只能推测可能是版本兼容性问题,细心的读者可能注意到,之前在PC端使用Live2D Cubism Viewer 4.2查看模型时,显示模型遵循的Live 2D SDK版本是3.3,如下图所示;而萌译使用的Live 2D SDK是最新的Cubism 5 SDK for Java R2。

因此推测闪退的原因是萌译使用的Live 2D SDK(Java)版本对旧版的SDK规范兼容性较差,导致播放旧版本的Live 2D动作时会出现越界问题,进而发生闪退;而PC端的Live2D Cubism Viewer能够兼容旧版的SDK规范,因此可以正常播放;也进一步推测《碧蓝航线》手游使用的Live 2D SDK(Java)版本应该较旧,以正常播放Live 2D模型的动作。
解决方案
虽然对于闪退的内部机理仍不清楚,但这并不妨碍我们解决这个问题,解决步骤如下:
在萌译中删除闪退的模型
打开模型列表,长按播放动作会闪退的模型,点击【删除模型】。
找到动作json文件
使用文件管理器(这里开发者使用的是MT管理器),找到您导入模型时选择的文件夹,并打开该模型的动作文件夹,以安克雷奇的换装为例,就是打开文件树中的motions文件夹。
修改所有的动作json文件
逐个打开文件夹中的动作json文件(其实就是文本文件),因为报错提示的是越界,因此我们可以粗暴地将
TotalPointCount
对应的数据改为999999
(“9”不要太多,防止数据溢出),修改完不要忘了保存。注意要修改所有点击后会发生闪退的动作json文件(基本上就是所有的动作json文件了)。重新导入模型
修改完成后,打开萌译,重新导入模型,应该发现可以正常播放动作了。