Unity BlendTree 手写实现:从权重计算到姿势插值

发布时间:2026/8/29 20:03:45
Unity BlendTree 手写实现:从权重计算到姿势插值 开场上周做角色 Locomotion 系统时翻车了——临时需求要求加入"侧身走"动画,但 Animator Controller 里的 BlendTree 已经堆了三层,任何参数调整都会让现有过渡崩掉。没办法,我把所有 BlendTree 逻辑从 Animator Controller 迁到 C# 代码里,自己手写权重计算和姿势插值。拆完才发现这东西没那么玄乎,核心就两件事:算权重+插姿势。但两件事各有一个容易写错的数学细节,下面连坑一起拆给你看。前置知识:了解 Animator Controller 的基本用法、向量点积、四元数的基本概念即可。一、算权重:参数到 N 个权重的映射1.1 1D 混合:分段线性插值1D BlendTree 的本质是"参数值在阈值轴上找区间,只对区间两端的动画做线性插值"。假设有 Idle/Walk/Run 三个动画,速度阈值分别是 0、2、5,求当前速度 3.0 下的权重:// 1D 混合权重计算 // thresholds: [0, 2, 5] 对应 Idle/Walk/Run,必须升序排列 // value: 当前速度,例如 3.0 float[] Compute1DWeights(float[] thresholds, float value) { int n = thresholds.Length; float[] weights = new float[n]; // 边界:value 超出阈值范围,直接取端点动画 if (value