Spine降版本兼容问题处理

2023-11-21 21:48

本文主要是介绍Spine降版本兼容问题处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

版本相关知识

首先了解一下与Spine版本相关的东西。一个是Spine的软件版本,一个是Spine的工程版本(.spine),一个是Spine导出的文件版本(.atlas png bytes/json),最后一个就是Unity使用的Spine runtime版本,这几个除了Spine的软件可以对Spine工程向下兼容,其他基本均不兼容,需要版本一致才能正常使用。其中runtime是开源工程,这里是git工程地址

Spine软件版本可以在启动的时候选择,如下图所示

高版本的Spine软件是可以打开低版本的工程文件的(4.0软件打开3.6工程),但是注意如果修改后进行保存,会导致工程文件升级到高版本,导致无法回退。所以在进行这个操作的时候,建议先备份低版本工程。

高版本的Spine软件是可以导出低版本的导出文件,可以在导出时选择版本,但是会存在一些信息丢失和兼容性问题。

Spine软件不能导入低版本的导出文件,Spine的导出文件和SpineRuntime版本是一一对应的,如果导出的Spine动画文件和Runtime版本是不一致的时候,可能会出现不兼容的问题。并且SpineRuntime和Unity也有一定的对应关系。下图是截止至2022.1.24时官网显示的对应关系,如有变化,可以点击查看官网信息

Spine runtime版本

支持的Unity版本

spine-unity 4.0.00+

Unity 2017.1-2021.1

spine-unity 3.8

Unity 2017.1-2020.3

spine-unity 3.7

Unity 5.6-2018.4

spine-unity 3.6

Unity 5.6-2018.2

spine-unity 3.5

Unity 5.4-2017.1

spine-unity 3.0

Unity 4.6

降版本操作步骤

操作环境:Unity目标版本是2020,spine runtime 3.6,spine工程和软件均为4.0

1.导出spine动画文件

打开工程,在导出文件的时候选择3.6版本,生成.atlas.txt .png .json文件

生成文件如下

这里需要注意一个问题,导出文件的spine版本字段需要修改,虽然选择的版本是3.6,但是导出时,版本字段显示为 "spine": "3.7-from-3.8-from-4.0.58",需要把spine版本字段改成3.6

修改前:

{"skeleton": { "hash": "/iWACBJx9C0", "spine": "3.7-from-3.8-from-4.0.58", "x": -1075.55, "y": -637.13, "width": 2041.4, "height": 1498.37 }}

修改后:

{"skeleton": { "hash": "/iWACBJx9C0", "spine": "3.6", "x": -1075.55, "y": -637.13, "width": 2041.4, "height": 1498.37 }}

2.生成材质和.asset文件

这里如果直接将生成的.atlas.txt .png .json文件导入到unity 2020工程中,会导致无法正确地生成SkeletonData.asset文件的情况。所以需要借助低版本的unity。

所以先将导出文件拖到已经加入spine 3.6 runtime的unity 2019工程中,正确生成.asset文件和材质。

3.导入spine导出文件和生成的材质和.asset文件

在unity2019中选中导出文件和生成的材质和.asset文件等,用导出资源的方式导出到.unitypackage文件中,最后回到unity 2020工程,再import .unitypackage文件。动画就可以正常使用了。(注意这里如果直接用拖文件的方式,直接拖到2020工程中同样会出错)

降版本导致的问题

1.丢失curve信息

用spine 4.0的软件分别导出3.6和4.0版本带curve属性的动画

下面是4.0版本,可以看到"curve"信息是正常导出的

"zhuzi4": {"translate": [{"time": 0.125,"x": -84.08,"y": -10.78,"curve": [0.307, -74.64, 0.477, -67.23, 0.307, -10.78, 0.477, -10.78]},{"time": 0.625,"x": -62.73,"y": -10.78,"curve": [1.055, -51.65, 1.457, -43.65, 1.055, -10.78, 1.457, -10.78]},{"time": 1.825,"x": -39.13,"y": -10.78,"curve": [1.884, -38.39, 1.942, -37.72, 1.884, -10.78, 1.942, -10.78]},{ "time": 2, "x": -37.15, "y": -10.78 }],"scale": [{ "x": 0.5, "y": 0.5, "curve": "stepped" },{ "time": 0.125, "x": 0.5, "y": 0.5 },{ "time": 0.3, "x": 1.04, "y": 1.04, "curve": "stepped" },{ "time": 1.825, "x": 1.04, "y": 1.04 }]}

下面是3.6版本,可以看到translate的所有curve信息都丢失了。

"zhuzi4": {"translate": [{ "time": 0.125, "x": -84.08, "y": -10.78 },{ "time": 0.625, "x": -62.73, "y": -10.78 },{ "time": 1.825, "x": -39.13, "y": -10.78 },{ "time": 2, "x": -37.15, "y": -10.78 }],"scale": [{ "x": 0.5, "y": 0.5, "curve": "stepped", "time": 0.0 },{ "time": 0.125, "x": 0.5, "y": 0.5 },{ "time": 0.3, "x": 1.04, "y": 1.04, "curve": "stepped" },{ "time": 1.825, "x": 1.04, "y": 1.04 }]}

去官网反馈了这个问题,官方回复是,高版本导出低版本文件的时候就是会丢失一些信息,这里可以查看帖子

不过经过尝试发现,其实3.6本身是支持curve操作的,所以可以手动将4.0导出文件的curve属性添加到3.6的导出文件中。

2.Path动画丢失

导入动画发现原先设置的路径动画丢失。对比了一下用4.0版本工程导出的3.6版本json,和用3.6版本工程导出的3.6版本json文件发现。3.6导出的json文件中路径动画的关键字是"paths",而4.0导出的json文件路径动画是"path",导致json解析的时候无法识别。查看spine runtime相关代码发现json解析的逻辑是在SkeletonJson.cs中 // Path constraint timelines. 下方的代码

原代码是

// Path constraint timelines.
if (map.ContainsKey("paths")) 
{foreach (KeyValuePair<String, Object> constraintMap in (Dictionary<String, Object>)map["paths"]) {//这里的逻辑无需修改,就不贴了}
} 

修改后的代码是

// Path constraint timelines.
// 3.6版本默认导出的key是paths,4.0降版本之后导出的key是path,为了兼容,同事判断两个key
string[] pathKeys = { "paths", "path" };
string finalKey = null;
for (int i = 0; i < pathKeys.Length; i++)
{if (map.ContainsKey(pathKeys[i])){finalKey = pathKeys[i];break;}
}
if (finalKey != null) 
{foreach (KeyValuePair<String, Object> constraintMap in (Dictionary<String, Object>)map[finalKey]) {//这里的逻辑无需修改,就不贴了}
}

修改之后路径动画就可以正常播放了.

这篇关于Spine降版本兼容问题处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/405314

相关文章

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

Python异常处理之避免try-except滥用的3个核心原则

《Python异常处理之避免try-except滥用的3个核心原则》在Python开发中,异常处理是保证程序健壮性的关键机制,本文结合真实案例与Python核心机制,提炼出避免异常滥用的三大原则,有需... 目录一、精准打击:只捕获可预见的异常类型1.1 通用异常捕获的陷阱1.2 精准捕获的实践方案1.3

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Python动态处理文件编码的完整指南

《Python动态处理文件编码的完整指南》在Python文件处理的高级应用中,我们经常会遇到需要动态处理文件编码的场景,本文将深入探讨Python中动态处理文件编码的技术,有需要的小伙伴可以了解下... 目录引言一、理解python的文件编码体系1.1 Python的IO层次结构1.2 编码问题的常见场景二

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建