前段时间游戏遇到一个真机闪退问题,没有打印,没有加载报错,找问题来真是头大。
渠道:PPTV
问题:模型预制体上一个Animation组件中 clip丢失。
现象:加载资源闪退。
猜想:我们项目是依赖打包,该预制体单独打包为A,它依赖的所有clip打成一个包B。加载预制体A时,发现它有依赖关系的动画片段未加载,会去加载B包,但B包里面没有该动画片段。没有报错是因为A包和依赖包B确实加载成功。
疑问:只有一个渠道才会闪退,其他平台都能正常运行,会不会是PPTV的SDK处理加载导致崩溃。
今天在加载资源的地方增加检查Animation的clip missing方法。发现没有直接调用的API,所以通过比较GetClipCount()和获取所有动画片段数量来比较是否有动画片段丢失。
Unity中动画组件获取当前动画片段数量:GetClipCount()
增加一个方法计算当前所有动画片段数量GetClipCount(Animation ani),如果是编辑器上的话,可以直接调用API:AnimationUtility.GetAnimationClips。
public void CheckAnimationClip(GameObject go,string assetPath)
{
if (!UsedAssetBundle && FResourceCommon.IsEditor())
{
var m_Animations = go.transform.GetComponents<Animation>();
for (int i = 0; i < m_Animations.Length; i++)
{
var m_Animation = m_Animations[i];
//var _temp = AnimationUtility.GetAnimationClips(m_Animation.gameObject);
int _clipCount = m_Animation.GetClipCount();
if (GetClipCount(m_Animation) != _clipCount)
{
Log.Error("检查动画组件是否missing:" + assetPath + ",GameObject名称:" + m_Animation.name);
}
}
}
}
private int GetClipCount(Animation ani)
{
int _count = 0;
foreach (AnimationState item in ani)
{
_count++;
}
return _count;
}
比较两个数量是否一致,如果不一致说明有动画片段丢失。