Harald

你可以在下面找到官方编译的spine-unity 3.8 to 4.0升级指南。本指南是从这个论坛帖子机器翻译的。如果您发现任何翻译错误,请在下方留言告诉我们!
(You can find the officially compiled spine-unity 3.8 to 4.0 Upgrade Guide below. This guide has been machine translated from this forum posting. If you find any translation errors, please let us know by posting below!)

如果您是从 3.8 之前版本的 Spine-unity 升级,请参阅相应的升级指南,了解如何相应地调整您的代码和资产:
Spine-Unity 3.7 to 3.8 Upgrade Guide
Spine-Unity 3.6 to 3.7 Upgrade Guide

重新导出你的骨架数据
注意:从 Spine 3.8 导出的 Json 和二进制骨架数据文件将无法被 Spine-Unity 4.0 运行时读取!
骨架数据文件需要使用 Spine 4.0 重新导出。

如果您有很多项目,我们建议自动导出您的项目文件:
Export - Spine User Guide: Command line
例如,这是我们用来导出所有 Spine 示例项目并创建纹理图集的脚本:
https://github.com/EsotericSoftware/spine-runtimes/blob/4.0/examples/export/export.sh

从3.8升级到4.0的推荐升级步骤:
  1. 为安全起见,创建 3.8 项目的备份。
  2. 关闭所有打开的场景并创建一个新的空白场景,并且没有选择任何内容。这是为了确保没有活动的 Spine 对象。
  3. 请注意您对 Spine-Unity 运行时所做的任何自定义更改。
  4. 删除旧的“Spine”和“Spine Examples”文件夹。
  5. 关闭项目和 Unity。
  6. 用重新导出的 4.0 副本替换旧的导出的 3.8 骨架资产。
  7. 再次打开 Unity 和您的项目。
  8. 导入最新的 Spine-Unity 4.0 unitypackage。
  9. 在项目面板中选择RightMouseButton - Reimport All(或在包含骨架资源的文件夹上选择Reimport)。

使您的代码适应 4.0 API 更改
有关 API 的显着更改,请参阅更改日志、C#Unity 部分
https://github.com/EsotericSoftware/spine-runtimes/blob/4.0/CHANGELOG.md#c-2

一些方法在 4.0 中已被重命名或替换。
如果由于使用重命名的和不再存在的方法而从您自己的代码中收到编译错误,变更日志中的以下几点将有助于执行所需的步骤,使您自己的代码再次兼容:
  1. 所有Spine.Unity.AttachmentTools.SkinUtilities Skin 扩展方法都已被删除,这些方法被新的 Skin API 取代。要修复任何编译错误,请将 Skin 扩展方法的任何用法替换为其对应方法,例如用 skin.AddSkin() 替换 skin.AddAttachments() 的出现。如果您使用的是UnshareSkin(),您可以将其替换如下:
    skeletonAnimation.Skeleton.UnshareSkin();
    // 替换为以下代码:
    皮肤 customSkin = new Skin("自定义皮肤");
    customSkin.AddSkin(skeletonAnimation.Skeleton.Skin);
    请参阅示例场景“Mix and Match Skins”了解如何使用新的 Skin API 来组合皮肤,或更新旧的示例场景“Mix and Match”和“Mix and Match Equip”了解如何更新现有项目正在使用旧的工作流程。
  2. 将任何出现的 Skin.GetAttachments() 替换为 Skin.Attachments。返回类型已更改为ICollection<SkinEntry>
  3. Spine.Unity.AttachmentTools.AttachmentCloneExtensions 扩展方法已被删除。将任何出现的“Attachment.GetCopy()”替换为“Attachment.Copy()”,将“Attachment.GetLinkedMesh()”替换为“Attachment.NewLinkedMesh()”。
  4. 移除了 Spine.Unity.AttachmentTools.AttachmentRegionExtensions 扩展方法 Attachment.GetRegion()。使用 Attachment.RendererObject as AtlasRegion 代替。
  5. 删除了多余的 Spine.SkeletonExtensions 扩展方法:
    用Skeleton.SetSlotsToSetupPose()
    代替:
    • Skeleton.SetPropertyToSetupPose()
    • Skeleton.SetDrawOrderToSetupPose()
    • Skeleton.SetSlotAttachmentsToSetupPose()
    • Skeleton.SetSlotAttachmentToSetupPose()
    用Slot.SetToSetupPose()
    代替:
    • Slot.SetColorToSetupPose()
    • Slot.SetAttachmentToSetupPose()
    还删除了不太常用的扩展方法:
    TrackEntry.AllowImmediateQueue()Animation.SetKeyedItemsToSetupPose()Attachment.IsRenderable()
  6. 删除了 SkeletonData 和 Skeleton 方法:FindBoneIndexFindSlotIndex。 骨骼和插槽有一个应该使用的 Index 字段。 一定要检查例如 在必要时访问 slot.Index 之前相应的 slot == null

    • SlotData slot = skeletonData.FindSlot(slotName); int index = slot != null ? slot.Index : -1;
    代替:
    • int index = skeletonData.FindSlotIndex(slotName);


    • Bone 骨骼 = skeleton.FindBone(boneName); int index = 骨骼 != null ? 骨骼索引:-1;
    代替:
    • int index = skeleton.FindBoneIndex(boneName);
从 3.8 到 4.0 的行为变化
有关行为更改的完整列表,请再次查看更改日志,“C#”和“Unity”部分
https://github.com/EsotericSoftware/spine-runtimes/blob/4.0/CHANGELOG.md#c-2

  • 约束不再重置其他约束所做的更改。在 3.8 中,一个约束可以恢复另一个约束所做的更改。在 4.0 中,这种情况不再发生。如果您的项目碰巧依赖于 3.8 中的行为,那么当您移动到 ​​4.0 时,您可能会遇到一个意外影响骨骼的约束。
  • allowMultipleCanvasRenderers 为 true 时,SkeletonGraphic 现在不再在每个子网格渲染器游戏对象中使用 RawImage 组件。相反,使用了一个新的自定义组件 SkeletonSubmeshGraphic,它对资源更加友好。这些组件的替换将通过编辑器脚本自动执行,保存场景或预制件将持续升级。
  • 线性色彩空间:以前在 Unity Linear 色彩空间中显示的插槽颜色与在带有 Color management - Linear blending Spine Editor 设置的 Spine Editor 中显示的不同。现在已在所有着色器中修复此问题,包括 URP 和 LWRP 着色器。如果您调整了插槽颜色以补偿不正确的显示,您可能需要调整调整后的颜色。
  • 附加槽在写入目标缓冲区之前总是被点亮。现在所有光照着色器都提供了一个附加参数“Light Affects Additive”,默认为“false”,因为它是更直观的默认值。您可以通过将此参数设置为“true”来启用旧行为。
  • 更正了在Premultiply Alpha 混合模式(包括URP 和LWRP 包)中所有Sprite 着色器的混合行为。以前顶点颜色 alpha 再次预乘,即使“预乘 Alpha”混合模式假定 PMA 纹理和 PMA 顶点颜色输入。因此,升级到 4.0 后,Slot-alpha 混合将正确地变轻。如果您已通过禁用“高级 - PMA 顶点颜色”来解决此问题,您现在可以重新启用此参数,还允许在单次通过中渲染添加插槽。
  • 在禁用Advanced - Sample 8 Neighbourhood时更正了所有Outline着色器轮廓厚度(因此使用4 Neighbourhood)。要恢复先前的轮廓厚度,请通过在禁用“示例 8 邻域”的轮廓着色器处添加“/4”以使阈值减小 4 倍来调整“轮廓阈值”参数。
  • 타임라인이 Director 일시 중지 시 클립 재생을 일시 중지(및 재개)하지 않는 문제를 수정했습니다. 이것이 이제 기본 동작입니다. 이전 동작이 필요한 경우(예: Director 일시 중지 중에 유휴 애니메이션을 계속 재생하기 위해) 이제 각 타임라인 클립에 활성화할 수 있는 추가 매개변수 Don't Pause with Director가 제공됩니다.
  • 修复了时间轴Spine AnimationState Clips在剪辑结束后忽略时间轴上的空白区域的问题。 如果您更喜欢以前版本的旧行为,时间线剪辑现在还提供“不要以剪辑结束”和“剪辑结束混合输出持续时间”参数。 默认情况下,当时间轴上的剪辑出现空白空间时,空动画在轨道上设置为“剪辑结束混合输出持续时间”的 MixDuration。 将 Don't End with Clip 设置为 true 以继续播放剪辑的动画并模仿旧的 3.8 行为。 如果您更喜欢暂停动画而不是混合到空动画中,请将 Clip End Mix Out Duration 设置为小于 0 的值,然后动画会暂停。

您可以从下载页面下载新的 unitypackages:
Spine Unity Download

如果您发现任何应该注意或添加到指南中的内容,请不要犹豫在下面发布,以便我们可以让每个人都尽可能轻松轻松地升级。

我们希望您喜欢新的 Spine 版本,并能够用它创造出更多令人难以置信的游戏! :)

---

[编辑] 我刚刚在上面的“行为变化”列表中添加了两个项目:

  • 타임라인이 Director 일시 중지 시 클립 재생을 일시 중지(및 재개)하지 않는 문제를 수정했습니다. 이것이 이제 기본 동작입니다. 이전 동작이 필요한 경우(예: Director 일시 중지 중에 유휴 애니메이션을 계속 재생하기 위해) 이제 각 타임라인 클립에 활성화할 수 있는 추가 매개변수 Don't Pause with Director가 제공됩니다.
  • 修复了时间轴Spine AnimationState Clips在剪辑结束后忽略时间轴上的空白区域的问题。 如果您更喜欢以前版本的旧行为,时间线剪辑现在还提供“不要以剪辑结束”和“剪辑结束混合输出持续时间”参数。 默认情况下,当时间轴上的剪辑出现空白空间时,空动画在轨道上设置为“剪辑结束混合输出持续时间”的 MixDuration。 将 Don't End with Clip 设置为 true 以继续播放剪辑的动画并模仿旧的 3.8 行为。 如果您更喜欢暂停动画而不是混合到空动画中,请将 Clip End Mix Out Duration 设置为小于 0 的值,然后动画会暂停。
-----
[Edit] I just added two items to the Behavioural Changes list above:

  • Fixed Timeline not pausing (and resuming) clip playback on Director pause, this is now the default behaviour. If you require the old behaviour (e.g. to continue playing an idle animation during Director pause), there is now an additional parameter Don't Pause with Director provided that can be enabled for each Timeline clip.
  • Fixed Timeline Spine AnimationState Clips ignoring empty space on the Timeline after a clip's end. Timeline clips now also offer Don't End with Clip and Clip End Mix Out Duration parameters if you prefer the old behaviour of previous versions. By default when empty space follows the clip on the timeline, the empty animation is set on the track with a MixDuration of Clip End Mix Out Duration. Set Don't End with Clip to true to continue playing the clip's animation instead and mimic the old 3.8 behaviour. If you prefer pausing the animation instead of mixing out to the empty animation, set Clip End Mix Out Duration to a value less than 0, then the animation is paused instead.
---
[编辑 #2] 我们刚刚用当前改进的解决方案替换了上面的第二个条目。
[Edit #2] We just replaced the second entry above with the current improved solution.
アバター
Harald

Harri
  • 記事: 3353

Wecica

用Skeleton.SetSlotsToSetupPose()
代替:
Skeleton.SetPropertyToSetupPose()
Skeleton.SetDrawOrderToSetupPose()
Skeleton.SetSlotAttachmentsToSetupPose()
Skeleton.SetSlotAttachmentToSetupPose()。

用Slot.SetToSetupPose()
代替:
Slot.SetColorToSetupPose()
Slot.SetAttachmentToSetupPose()。
这样翻译更符合汉语语法。
Wecica
  • 記事: 15

Harald

非常感谢您的举报! 我已经替换了上面的文字,希望现在是正确的。
Thanks very much for reporting! I have replaced the text above, I hope it is correct now.

---

我们刚刚在顶部的列表中为删除的方法添加了以下项目:

  • 删除了 SkeletonData 和 Skeleton 方法:FindBoneIndexFindSlotIndex。 骨骼和插槽有一个应该使用的 Index 字段。 一定要检查例如 在必要时访问 slot.Index 之前相应的 slot == null

    • SlotData slot = skeletonData.FindSlot(slotName); int index = slot != null ? slot.Index : -1;
    代替:
    • int index = skeletonData.FindSlotIndex(slotName);


    • Bone 骨骼 = skeleton.FindBone(boneName); int index = 骨骼 != null ? 骨骼索引:-1;
    代替:
    • int index = skeleton.FindBoneIndex(boneName);
    -----
We have just added the following item for removed method in the list on top:

  • Removed SkeletonData and Skeleton methods: FindBoneIndex, FindSlotIndex. Bones and slots have an Index field that should be used instead. Be sure to check for e.g. slot == null accordingly before accessing slot.Index where necessary.
    Replace:
    • int index = skeletonData.FindSlotIndex(slotName);
    with
    • SlotData slot = skeletonData.FindSlot(slotName); int index = slot != null ? slot.Index : -1;

    Replace:
    • int index = skeleton.FindBoneIndex(boneName);
    with
    • Bone bone = skeleton.FindBone(boneName); int index = bone != null ? bone.Index : -1;
アバター
Harald

Harri
  • 記事: 3353


Return to 中国Spine用户