使用Animation.AddClip()后添加的动画剪辑时长始终为1秒
问题原因与修复方案
核心问题:把帧序号当成了时间参数
你踩了Unity动画系统的一个常见坑——所有时间相关的参数都是秒,不是帧数。你直接用帧序号来设置关键帧时间和拆分区间,导致动画时长计算完全错误,最终所有拆分后的剪辑都被判定为1秒长。
具体修复步骤
1. 创建关键帧时转成秒
KeyFrame的time属性是秒数,不是帧序号。比如你的动画是60帧每秒,第100帧对应的时间是100/60≈1.6667秒,代码要这么写:
float frameRate = 60f; // 你的动画帧率 int targetFrame = 100; float timeInSeconds = targetFrame / frameRate; Keyframe keyframe = new Keyframe(timeInSeconds, 你的目标值);
同时别忘了给创建好的AnimationClip设置帧率:
createdAnimationClip.frameRate = frameRate;
2. 拆分剪辑时用秒作为区间
Animation.AddClip的start和end参数也是秒,同样要把帧区间转成秒:
float frameRate = createdAnimationClip.frameRate; // 0-100帧 → 0 到 100/frameRate 秒 anim.AddClip(createdAnimationClip, "name1", 0f, 100f/frameRate); // 100-200帧 → 100/frameRate 到 200/frameRate 秒 anim.AddClip(createdAnimationClip, "name2", 100f/frameRate, 200f/frameRate); // 200-500帧 → 200/frameRate 到 500/frameRate 秒 anim.AddClip(createdAnimationClip, "name3", 200f/frameRate, 500f/frameRate);
3. 验证原始剪辑时长
修复后可以用这段代码确认原始剪辑的时长是否符合预期:
Debug.Log($"原始剪辑时长:{createdAnimationClip.length}秒");
如果时长等于“总帧数/帧率”,说明关键帧设置没问题,拆分后的片段也会有正确的时长。
补充说明
Unity 2021.3.12是LTS稳定版本,这个逻辑没有已知bug,完全是参数单位混淆导致的问题。只要把帧数值转换成秒,就能解决播放时长异常的问题。
内容的提问来源于stack exchange,提问作者Viacheslav M
相关产品推荐
相关产品推荐

