Spinebot 感谢您的耐心解答,我会按照您的步骤逐一检查一下,目前我的spine项目只有一个皮肤,名称是001,需要替换的部位非常的多,包括5中武器的数个插槽都需要可以替换,面纱等附件也需要替换,这个项目包含了非常多的动作,每个职业对应的动作都不同。我还想咨询一下我们现在的spine项目建立的是否是合理的,还需要default的skin吗?当我们合并了  Skin combinedSkin = new Skin("combined-weapon");之后,并将它设置为当前的skin,那是不是下次再点击换装按钮的时候,combinedSkin 就变成了 Skin currentSkin = skeleton.Skin;了。问题较多,感谢解答。再附上一些代码,我的spine项目由于要多个spine复用动作,所以我是从spine导出的三个资产来加载生成的skeletonGraphics和skeletonAnimation的,不知道这样对换装是否有影响。下面是我的加载代码,`public class SkeletonGraphicLoader : MonoBehaviour
    {
        public TextAsset skeletonJson;  // 导出的骨骼数据文件 .json 或 .skel.bytes
        public TextAsset atlasText;     // 图集描述文件 .atlas.txt
        public Texture2D[] textures;   // 图片文件数组,通常是多个 PNG 图集
        public Material materialPropertySource;// 为 SkeletonGraphic 绑定的材质
        public Material skeletonGraphicMaterial;  //渲染的shader
        public string startingSkin = "base";  // 默认皮肤
        public string startingAnimation = "changjing/idle01";  // 默认动画
    private SkeletonGraphic skeletonGraphic;
    private SpineAtlasAsset runtimeAtlasAsset;
    private SkeletonDataAsset runtimeSkeletonDataAsset;
    public SkeletonGraphic SkeletonGraphic => skeletonGraphic;
    void Start()
    {
        CreateSkeletonGraphic();
    }
    private void CreateSkeletonGraphic()
    {
        runtimeAtlasAsset = SpineAtlasAsset.CreateRuntimeInstance(atlasText, textures, materialPropertySource, true);
        runtimeSkeletonDataAsset = SkeletonDataAsset.CreateRuntimeInstance(skeletonJson, runtimeAtlasAsset, true);
        skeletonGraphic = SkeletonGraphic.NewSkeletonGraphicGameObject(runtimeSkeletonDataAsset, this.gameObject.transform, skeletonGraphicMaterial);
        skeletonGraphic.name = "SkeletonGraphic";
        // 确保正确初始化
        if (skeletonGraphic != null)
        {
            skeletonGraphic.Initialize(false);
            // 检查材质设置
            if (skeletonGraphic.material != null)
            {
                Debug.Log($"SkeletonGraphic material: {skeletonGraphic.material.name}");
            }
            // 检查皮肤设置
            if (skeletonGraphic.Skeleton != null && skeletonGraphic.Skeleton.Skin != null)
            {
                Debug.Log($"Initial skin: {skeletonGraphic.Skeleton.Skin.Name}");
            }
        }
        if (!string.IsNullOrEmpty(startingSkin))
        {
            skeletonGraphic.Skeleton.SetSkin(startingSkin);
        }
        skeletonGraphic.Skeleton.SetSlotsToSetupPose();
        if (!string.IsNullOrEmpty(startingAnimation))
        {
            skeletonGraphic.AnimationState.SetAnimation(0, startingAnimation, true);
        }
        if (skeletonGraphic.Skeleton != null && skeletonGraphic.Skeleton.Skin != null)
        {
            Debug.Log($"Initial skin: {skeletonGraphic.Skeleton.Skin.Name}");
            // 打印当前皮肤的所有附件
            var skin = skeletonGraphic.Skeleton.Skin;
            for (int i = 0; i < skeletonGraphic.Skeleton.Data.Slots.Count; i++)
            {
                var slotData = skeletonGraphic.Skeleton.Data.Slots.Items[i];
                var attachments = new List<Skin.SkinEntry>();
                skin.GetAttachments(i, attachments);
                if (attachments.Count > 0)
                {
                    Debug.Log($"Slot {slotData.Name}:");
                    foreach (var entry in attachments)
                    {
                        Debug.Log($"  - {entry.Name}");
                    }
                }
            }
        }
        //skeletonGraphic.transform.localPosition = new Vector3(0f, -200f, 0f);
    }
}`  下面是我的按钮响应的代码,反复测试换装用的。不断用空白的武器或者默认的武器替换原始图集里面的对应附件。     private void ShowChangeWeapon()
    {
        string weaponSpritePath;
        if (isDefaultWeapon)
        {
            // 使用默认武器
            weaponSpritePath = "Assets/AssetBundles/Art/Sprites/Equipment/Default/jian.png";
        }
        else
        {
            // 使用空武器
            weaponSpritePath = "Assets/AssetBundles/Art/Sprites/Equipment/Empty/jian.png";
        }
        // 创建通知并发送
        ChangeWeaponNotification notification = ChangeWeaponNotification.Create(
            "empty_sword", 
            WeaponCategory.Sword, 
            weaponSpritePath
        );
                    // 切换武器标志
        isDefaultWeapon = !isDefaultWeapon;
        
        changeWeaponRequest.Raise(notification);
    }