【AI教人】UnityEditor扩展Spine动画,Spine骨骼,预览Preview一切

完全实现了spine加载,骨骼动画,换皮肤Skin

得益于:

  • Spine本身公开的结构
  • Unity的稳定性
  • 梁文峰的Deepseek
  • 在座各位的阅读理解结构分析

官方结构图

看上去没什么问题,但是一用就处处是异响

官方格式规范(最权威)

这两篇是 Esoteric Software 官方出的格式定义,字段含义、字节顺序、字符串编码规则都以它们为准:

加载流程与运行时机制

  • 加载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 官方出的格式定义,字段含义、字节顺序、字符串编码规则都以它们为准:

加载流程与运行时机制

  • 加载Skeleton数据 - Spine运行时指南 --- 讲清 SkeletonJson / SkeletonBinary 的 readSkeletonData 如何产出 SkeletonData,以及 AttachmentLoader、AtlasAttachmentLoader 的作用
  • spine-runtimes 官方仓库 --- 想真正搞懂解析逻辑,直接看 spine-csharp/src/SkeletonJson.cs 和 SkeletonBinary.cs,比任何二手文章都准确

实战解析类文章

可下载的参考文档

文库里没有找到专门讲 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

相关推荐
开开心心就好2 小时前
网页图片批量下载工具,输入链接就保存
服务器·算法·leetcode·支持向量机·pdf·ocr·1024程序员节
Martina_032117 小时前
AI生成的3D模型打印后沿层纹开裂?用6步检查方向、壁厚与填充
图像处理·人工智能·数学建模·3d·自然语言处理·游戏策划·1024程序员节
c_hn_00718 小时前
量化数据12:国内期货L2历史数据:Tick、逐笔、五档盘口一次性打包下载
数据库·1024程序员节·#深度订单簿数据·#历史行情订单薄·#本地csv数据存储
释厄62319 小时前
同性线套娃律——圆面积必然=1+2+...+n 的求和·圆心不与 π 相关
java·人工智能·算法·1024程序员节
在所不辞兄21 小时前
【零基础学智能仿真-69】综合项目——材料参数驱动的仿真研究
人工智能·深度学习·神经网络·算法·机器学习·1024程序员节
Captain1314_李祖团1 天前
章节3:MLIR完成一个端到端的流程
mlir·1024程序员节
Solange__1 天前
在线3D预览器、Blender和游戏引擎怎么选?按5类任务比较格式、隐私与编辑性
人工智能·游戏·3d·游戏引擎·blender·1024程序员节·关卡设计
爱青菜1 天前
Ribbon 七种负载均衡策略详解:原理、源码与选型实践
1024程序员节
云和数据.ChenGuang1 天前
再论深拷贝和浅拷贝
开发语言·人工智能·python·1024程序员节