• 中文
  • [ZH-CN]Spine-Unity 3.7 to 3.8升级指南

本文于2022-03-23译自官方的Spine-Unity 3.7 to 3.8 Upgrade Guide, 由作者@"Harald"#7956授权翻译, 本译本随官方文档更新.

This Guide was translated from Spine-Unity 3.7 to 3.8 Upgrade Guide, authorized by the writer @"Harald"#7956 at 2022-03-23.Update simultaneously with original post.


重导出skeleton数据
注意: 从Spine 3.7导出的Json和二进制skeleton数据文件无法被Spine-Unity 3.8运行时读取!
Skeleton数据文件应使用Spine 3.8重新导出.

如果你项目很多, 我们建议你自动化项目文件的导出:
导出 - Spine用户指南: 命令行
这里有一个脚本示例, 用于导出所有Spine示例项目并创建texture atlass:
spine-runtimes/export.sh at 3.8

从Spine-Unity 3.7升级至3.8的建议步骤:

  1. 以防万一, 先创建一个3.7版项目的备份.

  2. 关闭所有打开的场景并创建一个新的空白场景, 且不选中任何对象. 这是为了确保没有活动的Spine对象.

  3. 记下对Spine-Unity运行时所做的全部自定义修改. 把这些修改做个备份.

  4. 删除旧的"Spine"和"Spine Examples"文件夹.

  5. 关闭项目和Unity.

  6. 用重新导出的3.8版的skeleton资产替换3.7版本旧资产.

  7. 重新打开Unity和项目.

  8. 导入最新的Spine-Unity 3.8 unitypackage.

调整代码以适应3.8 API改动
关于API的主要更改, 请参见Changelog的C#Unity部分
spine-runtimes/CHANGELOG.md at 3.8

某些方法在3.8版中已更名或被替换.
如果你在代码中因为使用已更名或已移除的方法而收到编译错误, 执行以下检查步骤将有助于快速修复代码兼容性问题:

  1. Skin.SetAttachment()替换Skin.AddAttachment()

  2. Skin.GetAttachments(int slotIndex, List<SkinEntry> attachments)合并方法替换Skin.FindAttachmentsForSlot()Skin.FindNamesForSlot()

    // replace this code:
    List<Attachment> attachments = new List<Attachment>();
    List<string> names = new List<string>();
    skin.FindAttachmentsForSlot(slot, attachments);
    skin.FindNamesForSlot(slot, names);
    string name = names[index];
    string attachment = attachments[index];
    // with this code:
    List<Skin.SkinEntry> entries = new List<Skin.SkinEntry>();
    skin.GetAttachments(slot, entries);
    string name = entries[index].Name;
    string attachment = entries[index].Attachment;
    
  3. PoseSkeleton()PoseWithAnimation()扩展方法被移除. 作为替代, 你可以使用AnimationState.ClearTrack(0);然后是跟一句var entry = AnimationState.SetAnimation(0, animation, loop); entry.TrackTime = time来实现相同逻辑.

  4. Attachment.Copy()替换Attachment.GetClone(), 用MeshAttachment.NewLinkedMesh()替换MeshAttachment.GetLinkedClone().

  5. Attachment.GetCopy(bool cloneMeshesAsLinked)替换Attachment.GetClone(bool cloneMeshesAsLinked)

  6. SkeletonDataAsset.atlasAssets现在是基类AtlasAssetBase而非SpineAtlasAsset的数组了, 它用的是IEnumerable<> Materials而非List<> materials. 所以应使用atlasAsset.Materials.First()替换任何用atlasAsset.materials[0]来访问Materials的代码, 并顶部的命名空间中添加using System.Linq;声明.

  7. using Spine.Unity.Modules.AttachmentTools;替换using Spine.Unity.AttachmentTools;声明. 当文件中已经有using Spine.Unity.Modules;声明时, 可以移除这句using Spine.Unity;.

完整的变更列表请参见spine-runtimes/CHANGELOG.md at 3.8.

时间轴组件已被移至独立的UPM(Unity Package Manager)包中
更多信息请参见changelog:
spine-runtimes/CHANGELOG.md at 3.8

默认值变更

  1. SkeletonMecanimLayer Mix Mode现在默认为MixMode.MixNext而非MixMode.MixAlways. 在创建新SkeletonMecanim实例时请考虑这点, 该改动不影响现有实例. 注意: 在以前默认值是MixMode.SpineStyle的, MixMode.SpineStyle现已更名为MixMode.Hard.

  2. BlendModeMaterialAsset和其实例Default BlendModeMaterials.asset现在默认将Apply Additive Material置为true, 以便默认应用所有blend模式.

你可以从中文下载页面下载新unitypackages: Spine Unity下载页面

如果你发现有什么解释不清的地方, 或者在指南中有什么内容缺失, 请毫不犹豫地在此跟帖来痛陈高见, 这样我们才能让大家的升级之旅尽可能的更无脑&无痛.

希望诸位喜欢新版本的Spine, 并用它创造出更多令人惊叹的游戏佳作! 🙂

Related Discussions
...