kBlankii

  • 5 gün önce
  • 14 Mar tarihinde katıldı
  • 本文于2025-10-16译自官方的Spine-Unity 4.2 to 4.3 Upgrade Guide, 由原文作者 @Harald 授权翻译, 本译本随官方文档更新.

    This Guide was translated from Spine-Unity 4.2 to 4.3 Upgrade Guide, authorized by guide writer @Harald at 2025-10-16.Update simultaneously with original post.


    本文为4.3版运行时的完整官方升级指南.

    重新导出 skeleton 并升级 spine-unity 运行时文件
    请查阅以下 spine-unity 文档章节:
    spine-unity 运行时文档: 更新 spine-unity 运行时
    spine-unity 运行时文档: 更新 UPM 扩展包
    以上文档详细阐述了操作所需步骤, 包括重导出 skeletons、spine-unity 的跨版本升级, 以及如何安全地升级 spine-unity 运行时文件.

    ⚠️ spine-unity 4.3 的主要变更概览
    spine-unity 4.3 引入了两项重大的破坏性变更, 请务必按下文所述依序处理:

    1. spine-csharp API 变更: 底层的 C# 运行时采用了全新的姿态(pose)系统, 显著地改变了访问骨骼、槽位和约束属性的方式. 你必须先更新已有代码以适配新 API, 才能开始着手处理组件更改.

    2. spine-unity 组件模块化(split) (请在改完 API 后再着手更新): 核心的 skeleton 组件被拆分为了相互独立的渲染组件与动画组件. 虽然在打开场景/预制件(Prefab)时会自动升级组件, 但在脚本中引用的组件可能丢失引用,需进行迁移操作.

    重要提示: 请首先根据下文中的 spine-csharp API 变更列表更新你的代码, 再迁移至模块化组件. 严格遵守这一更新顺序才能确保你的代码在触及组件引用问题前仍保持正常编译.

    ┌─────────────────────────────────────────────────────┐
    │ 1. 更改代码以适配 spine-csharp 4.3 API 变更
    └─────────────────────────────────────────────────────┘

    如需查阅格式齐整的完整 API 变更列表, 请访问 Github 上变更日志(Changelog)中的 C#Unity 一节.

    如遇编译错误, 均可在下文中查找如何用新属性替换旧代码. 影响 Unity 的主要 C# API 变更便是新的姿态(pose)系统, 具体破坏性变更如下:

    1. 颜色属性 .R .G .B .A 已被 .GetColor().SetColor() 替代:

    • 颜色属性 .R .G .B .A 已被 .GetColor().SetColor() 替代

    • 暗色(Dark color)属性 .R2 .G2 .B2 已被 .GetDarkColor().SetDarkColor() 替代

    2. Bone 的本地变换属性已迁移至 Bone.Pose:

    • Bone.XBone.Pose.X

    • Bone.YBone.Pose.Y

    • Bone.RotationBone.Pose.Rotation

    • Bone.ScaleXBone.Pose.ScaleX

    • Bone.ScaleYBone.Pose.ScaleY

    • Bone.ShearXBone.Pose.ShearX

    • Bone.ShearYBone.Pose.ShearY

    3. Bone 的世界变换与应用变换属性已迁移至 Bone.AppliedPose:

    • Bone.AXBone.AppliedPose.X

    • Bone.AYBone.AppliedPose.Y

    • Bone.ARotationBone.AppliedPose.Rotation

    • Bone.AScaleXBone.AppliedPose.ScaleX

    • Bone.AScaleYBone.AppliedPose.ScaleY

    • Bone.AShearXBone.AppliedPose.ShearX

    • Bone.AShearYBone.AppliedPose.ShearY

    • Bone.WorldXBone.AppliedPose.WorldX

    • Bone.WorldYBone.AppliedPose.WorldY

    • Bone.WorldRotationXBone.AppliedPose.WorldRotationX

    • Bone.WorldRotationYBone.AppliedPose.WorldRotationY

    4. Slot 属性已迁移至 SlotPose, 即 Slot.AppliedPose:

    • Slot.AttachmentSlot.AppliedPose.Attachment

    • Slot.R, .G, .B, .ASlot.AppliedPose.GetColor()SetColor()

    • Slot.R2, .G2, .B2Slot.AppliedPose.GetDarkColor()SetDarkColor()

    • Slot.HasSecondColorSlot.AppliedPose.HasSecondColor

    • Slot.DeformSlot.AppliedPose.Deform

    • Slot.SequenceIndexSlot.AppliedPose.SequenceIndex

    5. Constraint 属性已迁移至 Constraint.Pose:

    IkConstraint:

    • IkConstraint.MixIkConstraint.Pose.Mix

    • IkConstraint.SoftnessIkConstraint.Pose.Softness

    • IkConstraint.BendDirectionIkConstraint.Pose.BendDirection

    • IkConstraint.CompressIkConstraint.Pose.Compress

    • IkConstraint.StretchIkConstraint.Pose.Stretch

    TransformConstraint:

    • TransformConstraint.MixRotateTransformConstraint.Pose.MixRotate

    • TransformConstraint.MixXTransformConstraint.Pose.MixX

    • TransformConstraint.MixYTransformConstraint.Pose.MixY

    • TransformConstraint.MixScaleXTransformConstraint.Pose.MixScaleX

    • TransformConstraint.MixScaleYTransformConstraint.Pose.MixScaleY

    • TransformConstraint.MixShearYTransformConstraint.Pose.MixShearY

    PathConstraint:

    • PathConstraint.PositionPathConstraint.Pose.Position

    • PathConstraint.SpacingPathConstraint.Pose.Spacing

    • PathConstraint.MixRotatePathConstraint.Pose.MixRotate

    • PathConstraint.MixXPathConstraint.Pose.MixX

    • PathConstraint.MixYPathConstraint.Pose.MixY

    PhysicsConstraint:

    • PhysicsConstraint.MixPhysicsConstraint.Pose.Mix

    • PhysicsConstraint.GravityPhysicsConstraint.Pose.Gravity

    • PhysicsConstraint.StrengthPhysicsConstraint.Pose.Strength

    • PhysicsConstraint.DampingPhysicsConstraint.Pose.Damping

    • PhysicsConstraint.MassInversePhysicsConstraint.Pose.MassInverse

    • PhysicsConstraint.WindPhysicsConstraint.Pose.Wind

    6. ConstraintData 属性已迁移至 ConstraintData.GetSetupPose():

    • IkConstraintData.MixIkConstraintData.GetSetupPose().Mix

    • 所有其他约束数据属性和类型 (TransformConstraintData, PathConstraintData, PhysicsConstraintData) 均有类似变更

    • ConstraintData.XXConstraintData.GetSetupPose().XX

    7. SkeletonData 现在使用统一的 IConstraintData 列表 SkeletonData.Constraints, 它替代了曾经按不同约束类型划分的多个列表:

    • SkeletonData.IkConstraintsSkeletonData.Constraints.OfType<IkConstraintData>()

    • SkeletonData.TransformConstraintsSkeletonData.Constraints.OfType<TransformConstraintData>()

    • SkeletonData.PathConstraintsSkeletonData.Constraints.OfType<PathConstraintData>()

    • SkeletonData.PhysicsConstraintsSkeletonData.Constraints.OfType<PhysicsConstraintData>()

    8. SkeletonData 现在使用 SkeletonData.FindConstraint<ConstraintData>(), 它替代了各约束类型自有的查找方法:

    • SkeletonData.FindIkConstraint(name)SkeletonData.FindConstraint<IkConstraintData>(name)

    • SkeletonData.FindTransformConstraint(name)SkeletonData.FindConstraint<TransformConstraintData>(name)

    • SkeletonData.FindPathConstraint(name)SkeletonData.FindConstraint<PathConstraintData>(name)

    • SkeletonData.FindPhysicsConstraint(name)SkeletonData.FindConstraint<PhysicsConstraintData>(name)

    9. 重命名了setup pose的方法:

    • Skeleton.SetToSetupPose()Skeleton.SetupPose()

    • Skeleton.SetBonesToSetupPose()Skeleton.SetupPoseBones()

    • Skeleton.SetSlotsToSetupPose()Skeleton.SetupPoseSlots()

    • Bone.SetToSetupPose()Bone.SetupPose()

    • Slot.SetToSetupPose()Slot.SetupPose()

    • IkConstraint.SetToSetupPose()IkConstraint.SetupPose()

    10. Skeleton.Physics 迁移至了 Spine 命名空间下的 Physics 中:

    • 可能与 Unity 的 UnityEngine.Physics 冲突

    • Spine Physics: UpdateWorldTransform(Skeleton.Physics.Update)UpdateWorldTransform(Spine.Physics.Update)

    • UnityEngine Physics: Physics.gravityUnityEngine.Physics.gravity

    11. 其他破坏性变更:

    • Bone 不再使用 Bone.Skeleton 属性, 构造函数也不再接受 skeleton 参数

    • 时间轴(Timeline)的 Apply() 方法现在可传入一个额外参数 appliedPose

    • 附件(Attachment)的 ComputeWorldVertices() 方法现在可传入一个额外参数 skeleton

    • 时间轴约束索引方法已重命名, 统一使用 ConstraintIndex 属性

    12. 仅涉及 Unity 的破坏性变更:

    • Spine 示例项目中的示例 skeletons 现在使用 straight alpha textures 和 materials, 以更好地兼容线性颜色空间

    • 默认的 atlas texture 工作流已从 PMA 改为了 straight alpha textures 以同时兼容伽马和线性两种颜色空间

    ┌───────────────────────────────────────────────┐
    │ 2. 适配 spine-unity 模块化组件架构
    └───────────────────────────────────────────────┘

    在完成上述 spine-csharp API 变更后, 便可开始处理组件模块化变更:

    核心的 skeleton 组件被拆分为了相互独立的渲染组件与动画组件. 这一变更使得更灵活的组合方式 (例如, 使用 SkeletonMecanim 控制动画, 同时使用 SkeletonGraphic 执行渲染) 成为可能, 但这也要求你迁移已有的项目.

    组件将在 Unity 编辑器中打开场景/预制件时会自动执行升级:

    • SkeletonAnimationSkeletonAnimation + SkeletonRenderer 组件

    • SkeletonMecanimSkeletonMecanim + SkeletonRenderer 组件

    • SkeletonGraphicSkeletonAnimation + SkeletonGraphic 组件

    然而它却可能导致你的脚本丢失引用, 因为组件类型已被变更(例如 SkeletonAnimation 不再是 SkeletonRenderer 的子类).

    📖 请阅读详细的模块化组件迁移指南:
    spine-unity 4.3 模块化组件迁移指南. 该指南亦提供 中文版日文版.

    该指南包含:

    • 迁移操作的逐步骤详细说明
    • 用于更新脚本的代码示例
    • 防止丢失组件引用的解决方案
    • (可选的) 从4.2升级至4.3的两阶段迁移路径

    默认值变更

    • Texture 默认工作流变更: 已从 PMA 改为 straight alpha textures, 以更好地兼容 Unity 默认的线性颜色空间. PMA Vertex Color 与此变更无关, 应仍保持启用以支持单通道 additive 渲染.

    • Spine Preferences 中添加了 Switch Texture Workflow 功能, 用以在 PMA 或 straight-alpha 的 texture 与 material 预设间快速切换.

    重构 (非破坏性变更)

    • Spine 示例现已迁移入 spine-unity UPM包中. 如需导入, 请在 Unity 包管理器窗口中选择 spine-unity Runtime 包, 并在 Samples 选项卡中点击 Import 按钮.

    官方支持的 Unity 版本: 2017.1-6000.1

    你可从下载页面获取新的 unitypackage: spine-unity 下载页

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

    我们深知本次更新会带来巨大的迁移工作量, 但我们相信, 独立的模块化动画和渲染组件带来的灵活性, 以及全新的多线程功能定会让你不虚此行. 更多详情请查阅运行时的 变更日志(CHANGELOG).

    真心希望你能喜欢经历了架构改进与性能提升后的 Spine 4.3-beta! 🙂

  • You can find the officially compiled Upgrade Guide for version 4.3 below.

    Note: Chinese and Japanese translations of this upgrade guide are available as well.

    Re-exporting skeletons and upgrading the spine-unity runtime files
    Please check out the spine-unity documentation sections below:
    spine-unity Runtime Documentation: Updating the spine-unity Runtime
    spine-unity Runtime Documentation: Updating an Extension UPM Package
    They describe necessary steps like re-exporting your skeletons, upgrading across multiple spine-unity versions and how to safely upgrade the spine-unity runtime files.

    ⚠️ Overview of Major Changes in 4.3
    spine-unity 4.3 introduces two major sets of breaking changes that you need to address in order:

    1. spine-csharp API changes: The underlying C# runtime introduces a new pose system that affects how you access bone, slot, and constraint properties. You'll need to update your existing code to use the new API before dealing with component changes.

    2. spine-unity component split (handle after API changes above): Main skeleton components have been split into separate rendering and animation components. While components are automatically upgraded when scenes/prefabs are opened, your component references in scripts may be lost and require migration.

    Important: Start by updating your code for the spine-csharp API changes below, then handle the component split migration. This order ensures your code compiles correctly before dealing with component reference issues.

    ┌─────────────────────────────────────────────────────┐
    │ 1. Adapting your code to spine-csharp 4.3 API changes
    └─────────────────────────────────────────────────────┘

    For the complete list of API changes with better formatting, please see the Changelog, sections C# and Unity.

    The main C# API changes that affect Unity include the new pose system with these breaking changes. For each compile error you receive, you should be able to search the listing below to find how to replace the old code with the new moved properties:

    1. Color properties .R .G .B .A are replaced by .GetColor() and .SetColor():

    • Color properties .R .G .B .A are replaced by .GetColor() and .SetColor()

    • Dark color properties .R2 .G2 .B2 are replaced by .GetDarkColor() and .SetDarkColor()

    2. Bone local transform properties moved to Bone.Pose:

    • Bone.XBone.Pose.X

    • Bone.YBone.Pose.Y

    • Bone.RotationBone.Pose.Rotation

    • Bone.ScaleXBone.Pose.ScaleX

    • Bone.ScaleYBone.Pose.ScaleY

    • Bone.ShearXBone.Pose.ShearX

    • Bone.ShearYBone.Pose.ShearY

    3. Bone world and applied transform properties moved to Bone.AppliedPose:

    • Bone.AXBone.AppliedPose.X

    • Bone.AYBone.AppliedPose.Y

    • Bone.ARotationBone.AppliedPose.Rotation

    • Bone.AScaleXBone.AppliedPose.ScaleX

    • Bone.AScaleYBone.AppliedPose.ScaleY

    • Bone.AShearXBone.AppliedPose.ShearX

    • Bone.AShearYBone.AppliedPose.ShearY

    • Bone.WorldXBone.AppliedPose.WorldX

    • Bone.WorldYBone.AppliedPose.WorldY

    • Bone.WorldRotationXBone.AppliedPose.WorldRotationX

    • Bone.WorldRotationYBone.AppliedPose.WorldRotationY

    4. Slot properties moved to SlotPose, i.e. Slot.AppliedPose:

    • Slot.AttachmentSlot.AppliedPose.Attachment

    • Slot.R, .G, .B, .ASlot.AppliedPose.GetColor() and SetColor()

    • Slot.R2, .G2, .B2Slot.AppliedPose.GetDarkColor() and SetDarkColor()

    • Slot.HasSecondColorSlot.AppliedPose.HasSecondColor

    • Slot.DeformSlot.AppliedPose.Deform

    • Slot.SequenceIndexSlot.AppliedPose.SequenceIndex

    5. Constraint properties moved to Constraint.Pose:

    IkConstraint:

    • IkConstraint.MixIkConstraint.Pose.Mix

    • IkConstraint.SoftnessIkConstraint.Pose.Softness

    • IkConstraint.BendDirectionIkConstraint.Pose.BendDirection

    • IkConstraint.CompressIkConstraint.Pose.Compress

    • IkConstraint.StretchIkConstraint.Pose.Stretch

    TransformConstraint:

    • TransformConstraint.MixRotateTransformConstraint.Pose.MixRotate

    • TransformConstraint.MixXTransformConstraint.Pose.MixX

    • TransformConstraint.MixYTransformConstraint.Pose.MixY

    • TransformConstraint.MixScaleXTransformConstraint.Pose.MixScaleX

    • TransformConstraint.MixScaleYTransformConstraint.Pose.MixScaleY

    • TransformConstraint.MixShearYTransformConstraint.Pose.MixShearY

    PathConstraint:

    • PathConstraint.PositionPathConstraint.Pose.Position

    • PathConstraint.SpacingPathConstraint.Pose.Spacing

    • PathConstraint.MixRotatePathConstraint.Pose.MixRotate

    • PathConstraint.MixXPathConstraint.Pose.MixX

    • PathConstraint.MixYPathConstraint.Pose.MixY

    PhysicsConstraint:

    • PhysicsConstraint.MixPhysicsConstraint.Pose.Mix

    • PhysicsConstraint.GravityPhysicsConstraint.Pose.Gravity

    • PhysicsConstraint.StrengthPhysicsConstraint.Pose.Strength

    • PhysicsConstraint.DampingPhysicsConstraint.Pose.Damping

    • PhysicsConstraint.MassInversePhysicsConstraint.Pose.MassInverse

    • PhysicsConstraint.WindPhysicsConstraint.Pose.Wind

    6. ConstraintData properties moved to ConstraintData.GetSetupPose():

    • IkConstraintData.MixIkConstraintData.GetSetupPose().Mix

    • Similar changes for all other constraint data properties and types (TransformConstraintData, PathConstraintData, PhysicsConstraintData)

    • ConstraintData.XXConstraintData.GetSetupPose().XX

    7. SkeletonData now provides a single IConstraintData list SkeletonData.Constraints instead of separate lists per constraint type:

    • SkeletonData.IkConstraintsSkeletonData.Constraints.OfType<IkConstraintData>()

    • SkeletonData.TransformConstraintsSkeletonData.Constraints.OfType<TransformConstraintData>()

    • SkeletonData.PathConstraintsSkeletonData.Constraints.OfType<PathConstraintData>()

    • SkeletonData.PhysicsConstraintsSkeletonData.Constraints.OfType<PhysicsConstraintData>()

    8. SkeletonData now provides SkeletonData.FindConstraint<ConstraintData>() instead of single find methods per constraint type:

    • SkeletonData.FindIkConstraint(name)SkeletonData.FindConstraint<IkConstraintData>(name)

    • SkeletonData.FindTransformConstraint(name)SkeletonData.FindConstraint<TransformConstraintData>(name)

    • SkeletonData.FindPathConstraint(name)SkeletonData.FindConstraint<PathConstraintData>(name)

    • SkeletonData.FindPhysicsConstraint(name)SkeletonData.FindConstraint<PhysicsConstraintData>(name)

    9. Renamed setup pose methods:

    • Skeleton.SetToSetupPose()Skeleton.SetupPose()

    • Skeleton.SetBonesToSetupPose()Skeleton.SetupPoseBones()

    • Skeleton.SetSlotsToSetupPose()Skeleton.SetupPoseSlots()

    • Bone.SetToSetupPose()Bone.SetupPose()

    • Slot.SetToSetupPose()Slot.SetupPose()

    • IkConstraint.SetToSetupPose()IkConstraint.SetupPose()

    10. Skeleton.Physics was moved to Physics directly in Spine namespace:

    • May clash with UnityEngine.Physics in Unity

    • Spine Physics: UpdateWorldTransform(Skeleton.Physics.Update)UpdateWorldTransform(Spine.Physics.Update)

    • UnityEngine Physics: Physics.gravityUnityEngine.Physics.gravity

    11. Other breaking changes:

    • Bone no longer provides a Bone.Skeleton property, constructor no longer takes a skeleton parameter

    • Timeline Apply() methods now take an additional appliedPose parameter

    • Attachment ComputeWorldVertices() methods now take an additional skeleton parameter

    • Renamed timeline constraint index methods to use unified ConstraintIndex property

    12. Unity-specific breaking changes:

    • Example skeletons in Spine Examples are now using straight alpha textures and materials for better compatibility with Linear colorspace

    • Changed default atlas texture workflow from PMA to straight alpha textures for better compatibility with both Gamma and Linear color space

    ┌───────────────────────────────────────────────┐
    │ 2. Adapting to spine-unity Component Architecture Split
    └───────────────────────────────────────────────┘

    After updating your code for the spine-csharp API changes above, you need to handle the component split changes:

    Main skeleton components have been split into separate rendering and animation components. This change enables new flexible combinations (like using SkeletonMecanim for animation with SkeletonGraphic for rendering) but requires migration of existing projects.

    Components will be automatically upgraded when scenes/prefabs are opened in the Unity Editor:

    • SkeletonAnimationSkeletonAnimation + SkeletonRenderer components

    • SkeletonMecanimSkeletonMecanim + SkeletonRenderer components

    • SkeletonGraphicSkeletonAnimation + SkeletonGraphic components

    However, existing references in your custom scripts may be lost because the component types no longer match (e.g., SkeletonAnimation is no longer a subclass of SkeletonRenderer).

    📖 Please read the detailed migration guide:
    4.3 Split Component Upgrade Guide. Available in Chinese and Japanese as well.

    This guide contains:

    • Step-by-step migration instructions
    • Code examples for updating your scripts
    • Solutions for preventing lost component references
    • Optional two-step migration path from 4.2

    Changes of default values

    • Default texture workflow changed: From PMA to straight alpha textures for better compatibility with Linear color space (Unity's default). PMA Vertex Color is independent of this and should still be enabled for single-pass additive rendering.

    • Added Spine Preferences Switch Texture Workflow functionality to quickly switch to the respective PMA or straight-alpha texture and material presets.

    Restructuring (Non-Breaking)

    • Spine Examples have been moved and are now part of the main spine-unity UPM package. To import, select the spine-unity Runtime package in the Package Manager window, and in the Samples tab and hit Import.

    Officially supported Unity versions: 2017.1-6000.1

    You can download the new unitypackages from the download page: spine-unity Download

    If you find anything that should be noted or added to the guide, please do not hesitate to post it below so that we can make upgrading as easy and painless as possible for everyone.

    We're aware that this update requires significant migration effort, but we hope that the gained flexibility of combining animation and rendering components independently and the new threading features make up for this. Check out the CHANGELOG for details.

    We hope that you like the new Spine 4.3-beta with its improved architecture and performance features! 🙂

    We are currently working on finishing our 4.3 release, which includes a revamped spine-godot for our new Spine Runtimes APIs. Once this is complete, we will work on Godot 4.5 support.

      Sorry for this taking so long. All issues related to UTF-8 should now be fixed. New Godot editor and extension builds are currently running on GitHub. Should be done in a few hours. You can then download them here.
      https://esotericsoftware.com/spine-godot

      kBlankii In addition to what Spinebot said, please also pay attention if you're performing the binding or editing of your mesh in animate mode instead of setup:
      https://esotericsoftware.com/blog/Mesh-weight-workflows#Be-mindful-of-when-you-bind-meshes-to-bones

      Testing carelessly in setup also may cause it (the paragraph under the previous in the article I linked above)

      If you accidentally deform a mesh, the quickest way to reset it is find a bone bound to the mesh that didn't cause movement of your vertices between setup and animate mode, change the weights of the affected vertices 100% on said bone, then in setup mode you can press "Update" in the weight panel to save the new bone configuration for the given mesh, and change the weights again to how you actually need them.

        You can do it in the editor. The physics constraint sees the changes in the world transform since last time it was applied and it causes the bones to "lag" behind, then catch up using forces. When you move your camera bone, it affects the physics constrained bone. When all the constraints are applied, the camera bone movement affects physics -- not what you want.

        The trick is to use a transform constraint where the camera bone X and Y translation is constrained and the target bone is what actually moves the camera. Next, place the transform constraint in the constraint order so it happens after the physics constraint (ie place it lower).

        This way the world transforms are computed, but the camera bone hasn't moved yet, then the constraints are applied. The physics constraint is applied first, so it sees the world transforms at that time, before the camera bone moves. Later in the constraint order the camera is moved by the transform constraint, but the physics constraint never sees that movement.

          kBlankii Thank you for providing us with the repro project! I was able to reproduce the crash. However, when I assigned SpineSkeletonDataResource to SpineSprite and it did not crash, at least the filename was displayed correctly, but the one you provided was garbled. The following error was also logged in the Output Dock:

          Resource file not found: res://spine/露露.png (expected type: )
            spine_godot/SpineAtlasResource.cpp:160 - Can't load texture: "res://spine/露露.png"

          So I tried to see if it would load successfully if I changed the filenames, and it did:

          The configuration of the skeleton itself has not been changed, so the names of the skeleton, bones, slots, and referenced images contain Chinese characters. I will update the issue later based on this, but for now, I would appreciate it if you could try to avoid using Chinese for animation names and exported file names as a workaround.