Unity自定义Animation-Rigging约束:带偏移的平滑跟随失效
实现带初始偏移的平滑跟随约束
核心思路
要同时实现保留初始相对偏移和平滑跟随,关键是先记录约束对象与源对象的初始位置差,再通过阻尼插值算法逐步更新约束对象位置,而非直接赋值。
代码修改实现
1. 调整Job结构体与ProcessAnimation方法
public struct MyDampTransformJob : IAnimationJob { public ReadOnlyTransformHandle sourceTransform; public TransformHandle constrainedTransform; // 初始位置偏移(约束对象相对于源对象的初始位置差) public Vector3 initialOffset; // 阻尼时间,控制平滑速度(值越小跟随越灵敏) public float dampTime; public void ProcessAnimation(AnimationStream stream) { // 获取源对象当前世界位置 Vector3 sourceWorldPos = sourceTransform.GetWorldPosition(stream); // 计算目标位置:源位置 + 初始偏移,保证相对位置不变 Vector3 targetPos = sourceWorldPos + initialOffset; // 获取约束对象当前世界位置 Vector3 currentPos = constrainedTransform.GetWorldPosition(stream); // 使用SmoothDamp实现平滑插值,基于动画帧的deltaTime计算 Vector3 smoothedPos = Vector3.SmoothDamp(currentPos, targetPos, ref Vector3.zero, dampTime, float.PositiveInfinity, stream.deltaTime); // 赋值平滑后的位置 constrainedTransform.SetWorldPosition(stream, smoothedPos); } public void ProcessRootMotion(AnimationStream stream) { } }
2. 初始化初始偏移
在约束组件的CreateJob方法中,启动时计算并赋值初始偏移:
public override IAnimationJob CreateJob(Animator animator, ref Skeleton skeleton, RigBuilder rigBuilder) { var job = new MyDampTransformJob(); // 绑定TransformHandle job.sourceTransform = rigBuilder.BindHandle(sourceTransform); job.constrainedTransform = rigBuilder.BindHandle(constrainedTransform); // 计算初始偏移:约束对象初始位置 - 源对象初始位置 job.initialOffset = constrainedTransform.position - sourceTransform.position; job.dampTime = 0.1f; // 可在Inspector面板暴露该参数供调试 return job; }
注意事项
- 初始偏移仅在约束启动时计算一次,避免每一帧重新计算导致偏移丢失
- 若需要局部空间内的跟随,将
GetWorldPosition/SetWorldPosition替换为GetLocalPosition/SetLocalPosition,偏移值也改用局部空间计算 dampTime参数可根据需求调整:值越小,跟随速度越快;值越大,平滑效果越明显
内容的提问来源于stack exchange,提问作者KilledByCheese
相关产品推荐
相关产品推荐

