- Modifié
参考Spine的官方代码,我在运行时加载两个SkeletonGraphics,然后将他们的皮肤进行组合,组合过程没有出错,新的组合的皮肤运行也正常,但是我发现组合之后的皮肤的清晰度比原来是降低了不少的,可能是什么原因呢?
{
// 确保两个CharacterFigureLoader实例都已加载
if (playerFigure == null || clothesFigure == null)
{
log.Debug("playerFigure或clothesFigure未初始化,无法换装");
yield break;
}
// 等待两个角色加载完成
while (playerFigure.SkeletonGraphic == null || clothesFigure.SkeletonGraphic == null)
{
log.Debug("等待Spine骨骼加载完成...");
yield return new WaitForSeconds(0.1f);
}
log.Debug($"开始换装: skinId={skinId}, skinType={skinType}");
try
{
// 直接使用CharacterFigureLoader中的SkeletonGraphic引用
Spine.SkeletonData clothesSkeletonData = clothesFigure.SkeletonGraphic.Skeleton.Data;
Spine.SkeletonData playerSkeletonData = playerFigure.SkeletonGraphic.Skeleton.Data;
// 从clothesFigure中获取头部皮肤
Spine.Skin clothesHeadSkin = clothesSkeletonData.FindSkin("tou");
if (clothesHeadSkin == null)
{
log.Error("无法获取clothesFigure的头部皮肤");
yield break;
}
// 从playerFigure中获取身体皮肤
Spine.Skin playerBodySkin = playerSkeletonData.FindSkin("shenti");
if (playerBodySkin == null)
{
log.Error("无法获取playerFigure的身体皮肤");
yield break;
}
// 从playerFigure中获取武器皮肤
Spine.Skin playerWeaponSkin = playerSkeletonData.FindSkin("wuqi");
if (playerWeaponSkin == null)
{
log.Debug("未找到playerFigure的武器皮肤,尝试使用默认皮肤");
// 可以选择继续而不中断流程
}
// 创建源材质,用于重新组合皮肤
Material sourceMaterial = playerFigure.SkeletonGraphic.SkeletonDataAsset.atlasAssets[0].PrimaryMaterial;
// 创建自定义组合皮肤
Spine.Skin combinedSkin = new Spine.Skin("combined-skin");
// 1. 先添加玩家的身体皮肤
combinedSkin.AddSkin(playerBodySkin);
// 2. 如果有武器皮肤,也添加进去
if (playerWeaponSkin != null)
{
combinedSkin.AddSkin(playerWeaponSkin);
}
// 3. 添加衣物角色的头部皮肤
combinedSkin.AddSkin(clothesHeadSkin);
log.Debug("已创建组合皮肤,准备重新打包");
// 重新打包皮肤以创建新的纹理图集
Texture2D runtimeAtlas;
Material runtimeMaterial;
Spine.Skin packedSkin = combinedSkin.GetRepackedSkin("combined-repacked",sourceMaterial,out runtimeMaterial,out runtimeAtlas);
// 应用新的组合皮肤
playerFigure.SkeletonGraphic.Skeleton.SetSkin(packedSkin);
playerFigure.SkeletonGraphic.Skeleton.SetSlotsToSetupPose();
// 更新骨骼图形
playerFigure.SkeletonGraphic.Update(0);
playerFigure.SkeletonGraphic.OverrideTexture = runtimeAtlas;
playerFigure.SkeletonGraphic.AnimationState.Apply(playerFigure.SkeletonGraphic.Skeleton);
// 清理缓存
Spine.Unity.AttachmentTools.AtlasUtilities.ClearCache();
log.Debug("头部换装完成");
}
catch (System.Exception e)
{
log.Error($"换装过程中发生错误: {e.Message}\n{e.StackTrace}");
// 尝试恢复到初始状态
try
{
playerFigure.SkeletonGraphic.Skeleton.SetSkin("all");
playerFigure.SkeletonGraphic.Skeleton.SetSlotsToSetupPose();
playerFigure.SkeletonGraphic.Update(0);
}
catch (System.Exception restoreEx)
{
log.Error($"恢复原始皮肤失败: {restoreEx.Message}");
}
}
}