Unity中如何在单个GameObject上切换不同骨骼的PSB文件实现动画切换?
解决Unity双PSB骨骼动画切换无显示问题
问题核心
你遇到的问题根源是:两套PSB的骨骼结构不一致,而Unity的Animator默认只绑定单个SkinnedMeshRenderer和对应的Avatar,直接把两个PSB挂在同一GameObject上,Animator不会自动切换渲染目标,只会播放绑定的那套动画,所以Game视图看不到状态切换效果。
两种可行解决方案
方案一:统一骨骼结构(优先推荐)
如果能调整PSB的骨骼层级,尽量让两套骨骼的核心命名和结构对齐,把奔跑状态的额外骨骼作为Idle骨骼的子节点,这样就能用同一个Avatar兼容两套动画,直接在Animator里切换状态就行:
- 打开Idle状态PSB对应的
SkinnedMeshRenderer,点击Generate Avatar生成基础Avatar。 - 选中Running状态的PSB,在Inspector面板的Avatar选项里,选择刚才生成的Idle Avatar,Unity会自动匹配同名骨骼,额外的骨骼会保留映射。
- 把两套动画剪辑拖进Animator的对应状态里,之前的状态切换逻辑不用改,Game视图就能正常播放切换动画了。
方案二:GameObject子对象切换(适合骨骼差异极大的情况)
如果没法统一骨骼结构,就把两套PSB做成独立的子GameObject,通过脚本在状态切换时启用/禁用对应的SkinnedMeshRenderer:
- 把Idle和Running的PSB分别拖到主角GameObject下作为子对象,初始时只启用Idle的子对象,禁用Running的。
- 给Animator的状态添加状态机行为,实现切换逻辑:
- 创建如下C#脚本:
using UnityEngine; public class SwitchMeshOnState : StateMachineBehaviour { public SkinnedMeshRenderer activeRenderer; public SkinnedMeshRenderer[] disableRenderers; public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { activeRenderer.enabled = true; foreach (var renderer in disableRenderers) { renderer.enabled = false; } } } - 打开Animator窗口,选中Idle状态,在Inspector里点击Add Behaviour,添加上面的脚本。
- 在脚本组件里,
activeRenderer选择Idle子对象的SkinnedMeshRenderer,disableRenderers添加Running子对象的SkinnedMeshRenderer。 - 对Running状态重复上述操作,把
activeRenderer设为Running的,disableRenderers设为Idle的。
- 创建如下C#脚本:
注意事项
- 用方案二时,确保两个子对象的Transform(位置、旋转、缩放)和主角完全一致,避免切换时出现角色偏移。
- 不要在同一GameObject上挂多个
SkinnedMeshRenderer,否则会出现渲染冲突,Animator也无法正确识别目标。
内容的提问来源于stack exchange,提问作者Estiem
相关产品推荐
相关产品推荐

