完全实现了spine加载,骨骼动画,换皮肤Skin
得益于:
- Spine本身公开的结构
- Unity的稳定性
- 梁文峰的Deepseek
- 在座各位的阅读理解结构分析
官方结构图

看上去没什么问题,但是一用就处处是异响
官方格式规范(最权威)
这两篇是 Esoteric Software 官方出的格式定义,字段含义、字节顺序、字符串编码规则都以它们为准:
- Spine: JSON导出文件格式 --- 逐字段说明
skeleton、bones、slots、skins、animations、attachments的结构,适合直接对照 .json 文件阅读 - Spine: 二进制导出文件格式 --- .skel 的字节级定义,包含
readInt、readFloat、变长 UTF-8 字符串、共享字符串表等细节
加载流程与运行时机制
- 加载Skeleton数据 - Spine运行时指南 --- 讲清
SkeletonJson/SkeletonBinary的readSkeletonData如何产出SkeletonData,以及AttachmentLoader、AtlasAttachmentLoader的作用 - spine-runtimes 官方仓库 --- 想真正搞懂解析逻辑,直接看
spine-csharp/src/SkeletonJson.cs和SkeletonBinary.cs,比任何二手文章都准确
开始摆弄 Spine Editor






动画时长
cs
// 改变 spine 动画的时间,长度等 ....
// var events = DisplayUtils.getSkeEvents(this.role.getAnimData(), this.role.action);
// if (events.length > 0) {
// time = events[0].time * 1000;
// }
结束事件
javascript
//this.skeleton 还有这个事件
// this.skeleton.on(Laya.Event.STOPPED, this, this.onEndEvent);
//这种事件
// if (this.skeleton) {
// this.skeleton.playbackRate(speed);
// this.skeleton.play(action, loop);
// }
一个挂机放置类战斗场景
名字:3分钟 -"Creator"-架构师进阶:打造基于MVC的UI框架
Data
SkeletonData.cs


cs
#region 解析SkeletonData + Skins
private void ParseSkeletonDataSkin(string assetPath)
{
_skinList.Clear();
_selectedSkeletonData = null;
// 只处理 SkeletonDataAsset
SkeletonDataAsset skeletonAsset = AssetDatabase.LoadAssetAtPath<SkeletonDataAsset>(assetPath);
if (skeletonAsset == null)
{
EditorUtility.DisplayDialog("解析失败", "该文件不是SkeletonDataAsset", "OK");
return;
}
// Spine 加载骨架数据
skeletonAsset.GetSkeletonData(true);
_selectedSkeletonData = skeletonAsset.GetSkeletonData(true);
if (_selectedSkeletonData == null)
{
EditorUtility.DisplayDialog("解析失败", "SkeletonData为空,检查Spine资源是否导入正常", "OK");
return;
}
// 遍历所有skin
foreach (var skin in _selectedSkeletonData.Skins)
{
_skinList.Add(skin.Name);
}
Debug.Log($"[SpineSkin] 解析成功,骨架:{_selectedSkeletonData.Name},Skin数量:{_skinList.Count}");
}
#endregion
MVC架构
(先演示一段《苍空物语》的过场
那些教程,XX专家大谈特谈,说怎么设计,怎么查找,用了什么模式等等都是废话
关键就是一句话(cocos creator举例,Unity|Unreal 同理)
@property
只要你这么写了,就是类的逻辑,和资源(视图)资源的分离,就做到了MVC,其他都是旁支末节
有人会说了,我用代码调用
(我就不举例了)
只要你写了,@property
(演示一段操作)
*起个中文名,吊炸天的
*淘宝卖个半成品
*做成 cocos battle suit
*苍空物语素材包提取

参考小店:
苍空物语美术素材资源二次元冒险游戏UI立绘图标场景道具特效音效-淘宝网 (taoba com)
单买立绘小店
苍空物语角色立绘Spine动画源文件55套立绘2d骨骼动画游戏CG素材-淘宝网 (taobao com
骨骼动画
有了MVC架构后,我们就可以随便摆弄视图,想像你是一个美术,因为前面MVC已经将代码逻辑,和视图美术分离了,所以这时候就可以随便摆弄美术资源了
(骨骼动画,有3个物件,)

代码一
cs
_selectedSkeletonAsset = dataAsset;
_selectedSkeletonData = _selectedSkeletonAsset.GetSkeletonData(false);
if (_selectedSkeletonData == null)
{
Debug.LogError("[SpineIndex] GetSkeletonData 返回null");
return;
}
// 2. 收集Skin、动画
_skinList = _selectedSkeletonData.Skins.Select(s => s.Name).ToList();
_animList = _selectedSkeletonData.Animations.Select(a => a.Name).ToList();
_selectedSkinIndex = 0;
_selectedAnimIndex = 0;
// 3. 底层Spine实例
_skeleton = new Skeleton(_selectedSkeletonData);
_animStateData = new Spine.AnimationStateData(_selectedSkeletonData);
_animState = new Spine.AnimationState(_animStateData);
// 默认皮肤 + 初始姿态
_skeleton.SetSkin(_skinList[0]);
_skeleton.SetSlotsToSetupPose();
_skeleton.UpdateWorldTransform();
代码二
cs
// 4. 临时GameObject + SkeletonRenderer
_tempPreviewGO = new GameObject("SpinePreviewTemp");
Debug.Log($"[SpineIndex] 创建临时GO:{_tempPreviewGO.name},实例ID:{_tempPreviewGO.GetInstanceID()}");
_tempPreviewGO.hideFlags = HideFlags.HideAndDontSave;
_skeletonRenderer = _tempPreviewGO.AddComponent<SkeletonRenderer>();
////////
// 5. RT + 临时正交相机
_rtPreview = new RenderTexture(PreviewTexW, PreviewTexH, 24, RenderTextureFormat.Default);
_rtPreview.hideFlags = HideFlags.HideAndDontSave;
GameObject camGo = new GameObject("PreviewCam");
camGo.hideFlags = HideFlags.HideAndDontSave;
_tempCam = camGo.AddComponent<Camera>();
_tempCam.clearFlags = CameraClearFlags.SolidColor;
_tempCam.backgroundColor = Color.black;
_tempCam.orthographic = true;
_tempCam.cullingMask = -1; // Everything
_tempCam.targetTexture = _rtPreview;
参考 零:
以上内容其实来自一个平平无奇的文章,一个配图都没有的文章,但是AI却能从中挖掘到有意思的内容,以前这样的文章真的"狗不理"
,但是经过结构,重新整理,一些平庸的内容得以重新焕发能量,实现之前绝不可能的@任务
官方格式规范(最权威)
这两篇是 Esoteric Software 官方出的格式定义,字段含义、字节顺序、字符串编码规则都以它们为准:
- Spine: JSON导出文件格式 --- 逐字段说明
skeleton、bones、slots、skins、animations、attachments的结构,适合直接对照 .json 文件阅读 - Spine: 二进制导出文件格式 --- .skel 的字节级定义,包含
readInt、readFloat、变长 UTF-8 字符串、共享字符串表等细节
加载流程与运行时机制
- 加载Skeleton数据 - Spine运行时指南 --- 讲清
SkeletonJson/SkeletonBinary的readSkeletonData如何产出SkeletonData,以及AttachmentLoader、AtlasAttachmentLoader的作用 - spine-runtimes 官方仓库 --- 想真正搞懂解析逻辑,直接看
spine-csharp/src/SkeletonJson.cs和SkeletonBinary.cs,比任何二手文章都准确
实战解析类文章
- Libgdx播放Spine动画(1)-基础 --- 用简化结构把 json 文件拆成
skeleton → bones → slots → skins → animations五层,并讲清了"皮肤里定义附件实现、插槽只存名字"这个容易混淆的点 - Godot 4.x 原生集成 Spine:从数据结构解析到性能优化 --- 带了一段 Python 解析 spine json 的伪代码,适合想自己写解析器的场景
- Unity | Spine动画高效导入与组件应用指南 --- 偏 Unity 侧,讲 .json / .skel.bytes / .atlas.txt / .png 四件套的对应关系和导入后
_SkeletonData、_Atlas、_Material的生成逻辑
可下载的参考文档
文库里没有找到专门讲 Spine 文件格式的文档,但这篇骨骼动画原理的资料可以帮你补上"数据如何驱动顶点"那部分底层逻辑,和 Spine 的网格蒙皮、权重机制是相通的:
- unity游戏之骨骼动画 --- 从程序视角拆解骨骼层级、顶点权重、4×4 矩阵坐标变换的计算原理,适合理解
SkeletonData里那些 transform 数据最终是怎么变成屏幕上的图像的
<平平无奇的配图的文章>
参考 - 无厘头:
( 完美解决)spine在场景编辑器不能实时预览动作的问题 - Creator 2.x - Cocos中文社区
Spine动画基础用法:停止,播放,倍速,暂停,继续,添加播放顺序,按顺序播放,左右旋转_spine 播放-CSDN博客 png、skel和atlas可以再用Spine打开吗? - Spine动画论坛 - CGJOY
官网 - 无厘头
Spine官网: 专注于游戏的2D动画软件 (esotericsoftware.com)
播放视图 - Spine用户指南 (esotericsoftware.com)
额外 - 无厘头
Spline - 3D Design tool in the browser with real-time collaboration
Spine User Guide - Images - YouTube
2D动画spine渲染原理解析与源码解读 - Unity
