Unity | Spine动画动态加载

一、准备工作

        Spine插件及基本知识可查看这篇文章:Unity | Spine动画记录-CSDN博客

二、Spine资源动态加载 

1.官方说明

        官方文档指出不建议这种操作。但spine-unity API允许在运行时从SkeletonDataAsset或甚至直接从三个导出的资产实例化SkeletonAnimation和SkeletonGraphic GameObjects。

2.注意事项

        注意:动态加载的三个文件需要命名,并且不能出错。因为源代码中需要用名称来匹配。如下方的代码中要求pageName与贴图name一致,不能有后缀。

public static SpineAtlasAsset CreateRuntimeInstance (TextAsset atlasText, Texture2D[] textures, Material materialPropertySource, bool initialize) {// Get atlas page names.string atlasString = atlasText.text;atlasString = atlasString.Replace("\r", "");string[] atlasLines = atlasString.Split('\n');var pages = new List<string>();for (int i = 0; i < atlasLines.Length - 1; i++) {if (atlasLines[i].Trim().Length == 0)pages.Add(atlasLines[i + 1].Trim().Replace(".png", ""));}// Populate Materials[] by matching texture names with page names.var materials = new Material[pages.Count];for (int i = 0, n = pages.Count; i < n; i++) {Material mat = null;// Search for a match.string pageName = pages[i];for (int j = 0, m = textures.Length; j < m; j++) {if (string.Equals(pageName, textures[j].name, System.StringComparison.OrdinalIgnoreCase)) {// Match found.mat = new Material(materialPropertySource);mat.mainTexture = textures[j];break;}}if (mat != null)materials[i] = mat;elsethrow new ArgumentException("Could not find matching atlas page in the texture array.");}// Create AtlasAsset normallyreturn CreateRuntimeInstance(atlasText, materials, initialize);
}

 3.代码实现

using Spine.Unity;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;public class DownloadSpine : MonoBehaviour
{public Shader shader;//选择Spine/Skeleton shaderprivate TextAsset skeletonJson;//json或者二进制文件private TextAsset atlasText;private Texture2D[] textures;private float delay = 0;private string skinName="base";private string animationName = "gun toss";private SpineAtlasAsset runtimeAtlasAsset;private SkeletonDataAsset runtimeSkeletonDataAsset;private SkeletonAnimation runtimeSkeletonAnimation;void Start(){StartCoroutine(DownloadFile("https://static0.***.com/ziliao/spineboy-unity/", "spineboy.atlas", "spineboy", "spineboy-unity"));}private IEnumerator DownloadFile(string dir, string atlasTextName, string imageName, string skeletonJsonName){//下载atlasTextUnityWebRequest request = UnityWebRequest.Get(dir + atlasTextName + ".txt");yield return request.SendWebRequest();if (request.result == UnityWebRequest.Result.Success){atlasText = new TextAsset(request.downloadHandler.text);atlasText.name = atlasTextName;}else{Debug.LogError("Error downloading atlasText asset: " + request.error);}//下载texturesrequest = UnityWebRequestTexture.GetTexture(dir + imageName + ".png");yield return request.SendWebRequest();if (request.result == UnityWebRequest.Result.Success){textures = new Texture2D[1];textures[0] = DownloadHandlerTexture.GetContent(request);textures[0].name = imageName;}else{Debug.LogError("Error downloading image asset: " + request.error);}//下载skeletonFilerequest = UnityWebRequest.Get(dir + skeletonJsonName + ".json");yield return request.SendWebRequest();if (request.result == UnityWebRequest.Result.Success){skeletonJson = new TextAsset(request.downloadHandler.text);skeletonJson.name = skeletonJsonName;}else{Debug.LogError("Error downloading json asset: " + request.error);}StartCoroutine(PlayAnim());}void CreateRuntimeAssetsAndGameObject(){Material material = new Material(shader);runtimeAtlasAsset = SpineAtlasAsset.CreateRuntimeInstance(atlasText, textures, material, true);runtimeSkeletonDataAsset = SkeletonDataAsset.CreateRuntimeInstance(skeletonJson, runtimeAtlasAsset, true);}IEnumerator PlayAnim(){CreateRuntimeAssetsAndGameObject();if (delay > 0){runtimeSkeletonDataAsset.GetSkeletonData(false);yield return new WaitForSeconds(delay);}runtimeSkeletonAnimation = SkeletonAnimation.NewSkeletonAnimationGameObject(runtimeSkeletonDataAsset);runtimeSkeletonAnimation.transform.position = new Vector3(0, -3, 0);// additional initializationruntimeSkeletonAnimation.Initialize(false);if (skinName != ""){runtimeSkeletonAnimation.Skeleton.SetSkin(skinName);}runtimeSkeletonAnimation.Skeleton.SetSlotsToSetupPose();if (animationName != ""){runtimeSkeletonAnimation.AnimationState.SetAnimation(0, animationName, true);}}
}

4.效果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/704449.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第189题|幂级数的展开的常规方法(二)|武忠祥老师每日一题

解题思路&#xff1a;将函数展开成幂级数有两种方法&#xff1a;一种是直接法&#xff08;这种一般比较麻烦&#xff09;&#xff0c;一种是拆解成现有展开式展开&#xff08;这种的特征一般是能因式分解&#xff09;。 第一步&#xff1a; 这里看到 ln(1-x-2x^2) 将里面的式…

使用Selenium破解滑动验证码的原理及解决思路

1、获取页面元素信息&#xff1a; 使用Selenium打开目标网页&#xff0c;并通过相关方法获取滑块、背景图等元素的位置和属性信息。可以使用Selenium提供的定位方法&#xff08;如xpath、CSS选择器等&#xff09;来找到这些元素。 可以使用find_element_by_xpath或find_elemen…

ctfshow SSRF 351-358

做题前,需要先学习关于ssrf漏洞的相关知识 小注意: 当使用 file_get_contents() 函数访问远程 URL 时&#xff0c;它会尝试获取该 URL 指向的资源的内容&#xff0c;并将内容以字符串的形式返回。 如果 b.php 文件是一个 PHP 文件&#xff0c;它包含的内容取决于该 PHP 文件…

【LInux】<基础IO> 文件操作 | 文件描述符 | 重定向

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

【环境安装】nodejs 国内源下载与安装以及 npm 国内源配置

前言 Node.js 是一个基于 Chrome V8 引擎构建的 JavaScript 运行时环境&#xff0c;它能够使 JavaScript 在服务器端运行。它拥有强大的包管理器 npm&#xff0c;使开发者能够轻松管理和共享 JavaScript 代码包。 在中国&#xff0c;由于众所周知的原因&#xff0c;我们可能会…

如何实现Linux双网卡同时连接内网和外网的配置?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

湖南大学OS-2018期末考试(不含解析)

前言 不知道哪里翻出来的一张&#xff0c;看着确实像期末考卷&#xff0c;暂且放一下。或许做过&#xff0c;或许没做过。 总之答案不记得了。做完可以评论区发一下或者找我发出来。 共6道大题。 一、(30%) 1. &#xff08;6%&#xff09; 进程间通信的两种方法分别是什么&…

代码随想录算法训练营第三十一天|455.分发饼干,376. 摆动序列,53. 最大子序和

455.分发饼干 优先把小饼干分给胃口值小的&#xff0c;或者是把大饼干分给胃口大的。 376. 摆动序列 class Solution { public:int wiggleMaxLength(vector<int>& nums) {if (nums.size() < 1) return nums.size();int curDiff 0; // 当前一对差值int preDiff …

C++ 结构体内存对齐

定义了两个结构体 typedef struct Cmd {uint8_t ua;uint8_t ub;uint8_t uc;uint32_t ue; } Cmd_t;typedef struct Cmd_tag {uint8_t value;uint8_t data[1]; // 将 data 定义为指向 Cmd_t 结构体的指针 } tag_t;在实际使用中&#xff0c;看见前人的代码是&#xff0c;new 一块内…

【Redis】Redis面试和工作中十有八九会遇到的问题

1. 数据类型 常用的Redis数据类型有5种&#xff0c;分别是&#xff1a; String、List、Set、SortedSet、Hash 还有一些高级数据类型&#xff0c;比如Bitmap、HyperLogLog、GEO等&#xff0c;其底层都是基于上述5种基本数据类型。因此在Redis的源码中&#xff0c;其实只有5种数…

Kubernetes集群自动化部署

目录 1.1 实验介绍 1.1.1 关于本实验 1.1.2 实验目的 1.2 环境准备 步骤 1 设置节点名 步骤 2 配置 hosts 节点名解析 步骤 3 配置免密登录 步骤 4 清空 iptables、关闭防火墙并禁用 selinux 步骤 5 关闭交换分区 步骤 6 开启 ipvs 步骤 7 设置时间同步 步骤 8 配置…

Linux程序开发(一):Linux基础入门安装和实操手册

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…