Unity | Spine动画动态加载

news2024/12/25 12:52:06

一、准备工作

        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;
		else
			throw new ArgumentException("Could not find matching atlas page in the texture array.");
	}

	// Create AtlasAsset normally
	return 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 shader

    private 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)
    {
        //下载atlasText
        UnityWebRequest 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);
        }
        //下载textures
        request = 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);
        }


        //下载skeletonFile
        request = 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 initialization
        runtimeSkeletonAnimation.Initialize(false);
        if (skinName != "")
        {
            runtimeSkeletonAnimation.Skeleton.SetSkin(skinName);
        }
        runtimeSkeletonAnimation.Skeleton.SetSlotsToSetupPose();
        if (animationName != "")
        {
            runtimeSkeletonAnimation.AnimationState.SetAnimation(0, animationName, true);
        }
    }
}

4.效果展示

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙应用布局ArkUI【基础运用案例】

布局基础运用案例 平级导航的复合网格视图 平级导航的复合网格视图常出现在同时展示多种不同内容的界面。 例如&#xff0c;市场类应用作为典型的平级导航&#xff0c;其首页不同板块采用了不同布局能力。 标题栏与搜索栏&#xff1a;因元素单一、位置固定在顶部&#xff0c…

如何管理测试计划?测试计划管理都使用哪些在线工具?YesDev

3.2 测试计划 测试计划Testing plan&#xff0c;描述了要进行的测试活动的范围、方法、资源和进度的文档&#xff1b;是对整个信息系统应用软件组装测试和确认测试。 3.2.1 管理测试计划 在测试计划&#xff0c;可以查看、管理和维护全部测试计划。 测试计划列表 点击【测…

AI预测福彩3D采取887定位大底=23策略+杀断组+杀组选+杀和尾+杀和值012缩水测试5月15日预测第1弹

昨天与一位玩3D的彩友通过视频直播的形式聊了下&#xff0c;受益匪浅&#xff0c;给我提供了一些比较有价值的建议&#xff0c;比如&#xff0c;对于887的定位策略&#xff0c;方向是没问题的&#xff0c;但是8873的话&#xff0c;还是缺乏一定的命中率&#xff0c;如果88723&a…

Mark赶紧码住!亚马逊跨境电商八个爆款选品方法

一、Best Sellers选品法 这个方法顾名思义&#xff0c;就是大家熟悉的热销榜单选品。不做过多解释&#xff0c;在自己熟悉的品类&#xff0c;隔几天就会观察一下前100名里有没有冒出什么新品。它和现有的产品相同还是不同&#xff0c;自己做哪些搭配或者迭代会不会打败它。综合…

Java项目:基于ssm框架实现的实验室耗材管理系统(B/S架构+源码+数据库+毕业论文+答辩PPT)

一、项目简介 本项目是一套基于ssm框架实现的实验室耗材管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 二、技术实现 jdk版本&#xff1a;1.8 …

✅什么是时间轮?

一、问题解析 时间轮算法&#xff08;Time Wheel Algorithm&#xff09;是一种用于处理定时任务和调度的常见算法。 时间轮算法主要需要定义一个时间轮盘&#xff0c;在一个时间轮盘中划分出多个槽位&#xff0c;每个槽位表示一个时间段&#xff0c;这个段可以是秒级、分钟级、…

YOLOv8改进教程|加入可改变核卷积AKConv模块,效果远超DSConv!

⭐⭐ YOLOv8改进专栏|包含主干、模块、注意力机制、检测头等前沿创新 ​ ⭐⭐ 一、 论文介绍 论文链接&#xff1a;https://arxiv.org/abs/2311.11587 代码链接&#xff1a;GitHub - CV-ZhangXin/AKConv 论文速览&#xff1a;&#xff1a;AKConv是2023年11月发表的一种可变卷积…

【Linux——Centos7安装RabbitMQ】 RabbitMQ无法连接

到这一步是基本已经装好了&#xff0c;现在是在开放端口&#xff0c;我这个报错是因为我的防火墙是处于关闭状态&#xff0c;所以在开放端口时会报防火墙为运行&#xff0c;把防火墙打开&#xff0c;在开放端口&#xff0c;就可以访问到了 重启防火墙&#xff1a; systemctl …

白酒:酒精度数对白酒风味的影响与品鉴技巧

云仓酒庄豪迈白酒作为品质的白酒品牌&#xff0c;其酒精度数对白酒风味的影响与品鉴技巧是品鉴爱好者关注的重点。酒精度数作为衡量白酒质量的一项重要指标&#xff0c;不仅决定了白酒的口感和风格&#xff0c;更在一定程度上体现了白酒的品质和价值。本文将探讨酒精度数对云仓…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.6讲 GPIO中断实验-GPIO驱动添加中断处理函数

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

2024年第十届中西部外语翻译大赛

2024年第十届中西部外语翻译大赛 竞赛信息 “由中西部翻译协会共同体指导发起&#xff0c;各省市译协共建学术指导委员会&#xff0c;2024年第十届中西部外语翻译大赛由中西部翻译协会共同体秘书处&#xff08;武汉公仪网络科技有限公司&#xff09;承办。” - 获奖证书样图 -…

MQTT_服务器的安装_1.3

此例子是以Windows系统安装开源版本的EMQX 下载 EMQX 下载并解压 解压如图 进入bin 文件夹在文件目录中输入cmd回车 启动服务器 然后在cmd中输入下面的代码&#xff08;会弹出一个访问网络的选项&#xff0c;确认可以访问网络&#xff09; emqx start 结果如图&#xff08;…

半小时搞懂STM32知识点——UART

1.UART 1.1为什么要使用UART这种协议?介绍一下UART及其特点 成本低&#xff0c;硬件简单&#xff0c;数据格式灵活&#xff1b; 低速全双工异步串行通信 1.2 UART数据帧格式&#xff1f; 起始位&#xff08;1&#xff09;&#xff0b;数据位&#xff08;5-8&#xff09; 校验位…

百面算法工程师 | YOLOv6面试考点原理全解析

本文给大家带来的百面算法工程师是深度学习目标检测YOLOv6面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的深度学习目标检测面试问题&#xff0c;并提供参考的回答…

项目管理—需求管理规程(软件研发过程标准,管理标准,标书技术编写,资质评审,安全管理体系,项目交付,实施运维,各类建设方案)

软件资料清单列表部分文档清单&#xff1a;工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求调查单&#xff0c;用户需求说明书&#xff0c;概要设计说明书&#xff0c;技术解…

GPT-4o 引领人机交互新风向,向量数据库赛道沸腾了

OpenAI 发布 ChatGPT-4o&#xff0c;意味着人机交互进入新的时代。Chat-GPT4o 是一个跨文本、视觉和音频端到端训练的新模型&#xff0c;所有输入和输出都由同一个神经网络处理。这也在告诉所有人&#xff0c;GenAI 连接非结构化数据&#xff0c;非结构化数据之间跨模态的交互正…

Geoserver

Geoserver GIS工具 文章目录 Geoserver前言一、Geoserver是什么&#xff1f;二、概念1.Geoserver结构图2.相关概念3.Geoserver相关站点4.Geoserver安装5.PostgreSQL安装1.拉取镜像2.创建挂载卷3.安装 6 Docker 环境安装postgrespostgis扩展 总结其他参考资料 前言 GeoServer&…

从开发板导出根文件系统并修改(Ubuntu)

前面提到过基于ubuntu-base去构建根文件系统基于Ubuntu-base构建根文件系统-CSDN博客&#xff0c;但是有时候我们并不需要重头开始&#xff0c;可以基于现有的根文件系统做调整。又或者我们直接在出厂的系统上去搭建好自己的运行环境并且编译出自己想要的程序&#xff0c;现在要…

Web浏览器的兼容性测试需要考虑哪些测试点?

测试web网站兼容性时&#xff0c;可以使用各种测试用例来确保网站在不同浏览器中的良好兼容性。以下是一些常见的兼容性测试用例示例&#xff1a; 1. 页面加载测试&#xff1a; - 确保网站在不同浏览器中正常加载&#xff0c;没有加载错误。 - 检查页面加载时间&#xff0c;…

Kivy UI界面

一、版本介绍 Ubuntu&#xff1a;18.04.6 LTS Conda&#xff1a;4.5.12 Python&#xff1a;3.6.15 Kivy&#xff1a;2.0.0 二、安装Kivy # 更新系统包列表 sudo apt-get update# 安装Kivy的依赖项 sudo apt-get install -y python-pip libsdl2-dev libsdl2-image-dev li…