layui导入 加载动画_Unity+模型/动画的优化方案

动画文件压缩是大部分Unity从业者都会遇到的问题,这里提供了《极无双》的优化方案。

导入网格设置

7137ad3d9c72c6d38a18bbb20bb04162.png

<图一,缺省的网格设置>

【选项释义】
[Meshes]ScaleFactor:为了补偿unity和其它三维建模软件间的单位差异,没有特殊需求的话设为1就可以了。MeshCompression:网格压缩,亲测质量差距比较大,不太建议开启。Read/Write Enabled:若开启,顶点可被实时修改,建议没有修改需求的模型关闭此选项。
注意,ParticalSystem -> Renderer -> RenderMode如果为Mesh,则使用到的Mesh需要打开这个选项。否则会有情况从AssetBundle加载后在某些安卓设备上崩溃。GenerateColliders:若开启,模型导入会自动建议碰撞体,静态物体根据需求开启。Generate Lightmap UVs:在第二UV通道存储lightmap信息。需要烘焙光照图的模型需要勾选改选项。
[Normals & Tangents]
法线和切线信息,如果渲染网格的时候不需要该信息,可以去掉。
[Materials]
通常我们不希望美术自己做材质,所以关闭。导入绑定设置

6bc3f348a3efb770c9366b2fa8a7bc0f.png

<图二,打开优化选项后的设置示意图>【选项释义】AnimationType:-None-Legacy旧版系统动画,效率低,不建议选择-Generic通用Mecanim动画-Humanoid人形Mecanim动画,适合应用于人形角色OptimizeGameObjects:优化骨骼结点。默认关闭(不优化,图三左图),可以运行时看到模型下的全部骨骼子节点。按照图二的设置打开这个优化并作了若干结点剔除(图三右图),运行时就只能看到暴露出来的若干结点了。这个优化会大幅节省Animatior.Update这一项的耗时。

406df04e77d5a61cb0f52f6fff72c839.png

<图三,游戏运行时的OptimizeGameObject效果对比>导入动画设置

d0f3953f8b77ae814053a52b7a8bad05.png

<图四,Animations导入设置,打开Optimal示例>【选项释义】Anim.Compression:-Off-Keyframe Reduction减少关键帧-Optimal最优的RotationError:旋转误差。使用角度(degree)作为单位。PositionError:位置误差。距离偏差的百分比(曲线调节前后的距离偏差与某距离值之比,取决于Unity内部实现),取值范围1~100,但实际可以高于100,并有作用。ScaleError:缩放误差。距离偏差的百分比(曲线调节前后的距离偏差与某距离值之比,取决于Unity内部实现),取值范围1~100,但实际可以高于100,并有作用。*建议调节该误差时,将调节前后的动画效果进行对比,使文件体积压缩的尽量小,同时使动画效果在视觉上偏差不会太大。动画文件优化思路1.使用Optimal压缩格式2.去除动画文件的scale信息对于一般的人形动画需求,不会有模型骨骼scale变化的情况。因此我们可以把动画信息的scale部分去除,可以节约一部分大小。3.缩减transform的float精度信息默认存储每一帧transform信息的是10位精度的float格式数据。建议通过导入器的OnPostprocessModel函数,缩减此数据为3位精度float,视觉效果基本一样。优化效果非常显著。

示例代码:

void OnPostprocessModel(GameObject g) {
List animationClipList = new List(AnimationUtility.GetAnimationClips(g));if (animationClipList.Count == 0) {
AnimationClip[] objectList = UnityEngine.Object.FindObjectsOfType (typeof(AnimationClip)) as AnimationClip[];
animationClipList.AddRange(objectList);
}foreach (AnimationClip theAnimation in animationClipList)
{try
{//去除scale曲线 foreach (EditorCurveBinding theCurveBinding in AnimationUtility.GetCurveBindings(theAnimation))
{string name = theCurveBinding.propertyName.ToLower();if (name.Contains("scale"))
{
AnimationUtility.SetEditorCurve(theAnimation, theCurveBinding, null);
}
} //浮点数精度压缩到f3 AnimationClipCurveData[] curves = null;
curves = AnimationUtility.GetAllCurves(theAnimation);
Keyframe key;
Keyframe[] keyFrames;for (int ii = 0; ii < curves.Length; ++ii)
{
AnimationClipCurveData curveDate = curves[ii];if (curveDate.curve == null || curveDate.curve.keys == null)
{continue;
}
keyFrames = curveDate.curve.keys;for (int i = 0; i < keyFrames.Length; i++)
{
key = keyFrames[i];
key.value = float.Parse(key.value.ToString("f3"));
key.inTangent = float.Parse(key.inTangent.ToString("f3"));
key.outTangent = float.Parse(key.outTangent.ToString("f3"));
keyFrames[i] = key;
}
curveDate.curve.keys = keyFrames;
theAnimation.SetCurve(curveDate.path, curveDate.type, curveDate.propertyName, curveDate.curve);
}
}catch (System.Exception e)
{
Debug.LogError(string.Format("CompressAnimationClip Failed !!! animationPath : {0} error: {1}", assetPath, e));
}
}
}

动画文件定量及测试结果
如何定量:
选中模型下的一个AnimationClip节点,在Inspector视图(如图五)中可查看这一动画文件实际占内存的大小。

0c2bd7197c74ab2b5ab2f08e91a651c4.png

<图五,通过动画文件的Inspector视图查看内存大小>以下为不同设置和优化处理下,项目中实测一个clip的内存大小对比:

b66ef7e6a57ff5e2ff27cc03e554bec2.png

来源知乎专栏: 钛核互动

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值