You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 把Idle和Running的PSB分别拖到主角GameObject下作为子对象,初始时只启用Idle的子对象,禁用Running的。
  2. 给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的。

注意事项

  • 用方案二时,确保两个子对象的Transform(位置、旋转、缩放)和主角完全一致,避免切换时出现角色偏移。
  • 不要在同一GameObject上挂多个SkinnedMeshRenderer,否则会出现渲染冲突,Animator也无法正确识别目标。

内容的提问来源于stack exchange,提问作者Estiem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:23:17