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.pswp.cn/diannao/13230.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13230.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13230.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

被耽誤了的發明家

高三的某一天&#xff0c;數學焦老師在黑板上推公式&#xff0c;突然花屁股&#xff08;見另一篇博文《數學老師們》&#xff09;上出現了一個光圈。我心里一樂&#xff0c;有人在玩鏡子。本來大家對于焦老師的花屁股已經司空見慣了&#xff0c;可以不受干擾地聽課&#xff0c;…

HNU-算法設計與分析-作業3

第三次作業【動態規劃】 文章目錄 第三次作業【動態規劃】<1>算法實現題 3-1 獨立任務最優解問題<2>算法實現題 3-4 數字三角形問題<3>算法實現題 3-8 最小m段和問題<4>算法實現題 3-25 m處理器問題 <1>算法實現題 3-1 獨立任務最優解問題 ▲問…

postgresql安裝及性能測試

postgresql安裝及性能測試 1. Postgresql介紹 Postgresql是一款功能強大的開源對象關系型數據庫管理系統&#xff08;ORDBMS&#xff09;&#xff0c;以其穩定性、擴展性和標準的SQL支持而聞名。它支持復雜查詢、外鍵、觸發器、視圖、事務完整性、多版本并發控制&#xff08;MV…

Linux(七) 動靜態庫

目錄 一、動靜態庫的概念 二、靜態庫的打包與使用 2.1 靜態庫的打包 2.2 靜態庫的使用 三、動態庫的打包與使用 3.1 動態庫的打包 3.2 動態庫的使用 3.3 運行動態庫的四種方法 四、總makefile 一、動靜態庫的概念 靜態庫&#xff1a; Linux下&#xff0c;以.a為后綴的…

Python專題:十五、JSON數據格式

Python的數據處理&#xff1a;JOSN 計算機的主要工作&#xff1a;處理數據 最容易處理的數據就是結構化數據 非結構化數據&#xff1a;視頻&#xff0c;文件等 近些年的大數據、數據挖掘就是對互聯網中的各種非結構化的數據的分析和處理 半結構化數據 明確的結構屬性&…

陪診服務運用預約小程序的效果是什么

在中高型城市里&#xff0c;陪診師近些年也很有熱度&#xff0c;已經衍生成為一個新的小眾行業&#xff0c;不同醫院/不同科目等其它情況針對不同群體往往很難完善&#xff0c;比如部分老年人腿腳不便、不認識字、外地語言難以溝通等&#xff0c;陪診師的作用就尤為凸顯. 對相…

[Bootloader][uboot]code總結

文章目錄 1、U_BOOT_DRIVER2、DM框架dm_scan_platdatadm_extended_scan_fdt 1、U_BOOT_DRIVER 使用這個宏可以定義一個驅動實例&#xff0c;宏定義是 其中使用的struct driver結構體 使用的ll_entry_declare宏定義是 歸結為 2、DM框架 1、 DM框架 DM模型抽象出了以下四個…

16.投影矩陣,最小二乘

文章目錄 1. 投影矩陣1.1 投影矩陣P1.2 投影向量 1. 投影矩陣 1.1 投影矩陣P 根據上節知識&#xff0c;我們知道當我們在解 A X b AXb AXb的時候&#xff0c;發現當向量b不在矩陣A的列空間的時候&#xff0c;我們希望的是通過投影&#xff0c;將向量b投影到矩陣A的列空間中&…

ModuleNotFoundError: No module named ‘sklearn‘

ModuleNotFoundError: No module named sklearn 解決辦法&#xff1a; pip install scikit-learn

7B2 PRO主題5.4.2免授權直接安裝

B2 PRO 5.4.2 最新免授權版不再需要改hosts&#xff0c;直接在wordpress上傳安裝即可

網站接入百度云防護CDN后回源率非常高原因

最近&#xff0c;有站長反饋網站接入百度云防護后&#xff0c;網站回源率非常高。 今天百度云來給大家講解下&#xff0c;CDN回源高的原因&#xff1a; 1.動態請求比較多 網站的動態請求很多&#xff0c;一般是回源率高的主要原因&#xff0c;因為CDN對待動態請求是每個請求…

Vue的學習 —— <網絡請求庫Axios>

目錄 前言 正文 一、Axios基本概念 二、安裝Axios 三、Axios使用方法 四、向服務器發送請求 前言 在之前的開發案例中&#xff0c;我們通常直接在組件中定義數據。但在實際的項目開發中&#xff0c;我們需要從服務器獲取數據。當其他用戶希望訪問我們自己編寫的網頁時&a…

定檔 11.2-3,COSCon'24 第九屆中國開源年會暨開源社十周年嘉年華正式啟動!

中國開源年會 COSCon 是業界最具影響力的開源盛會之一&#xff0c;由開源社在2015年首次發起&#xff0c;今年將舉辦第九屆。 以其獨特定位及日益增加的影響力&#xff0c;COSCon 吸引了越來越多的國內外企業、高校、開源組織/社區的大力支持。與一般企業、IT 媒體、行業協會舉…

網絡安全快速入門(十三)linux及vmware軟件的網絡配置

13.1 前言 在通過我們前面的了解&#xff0c;我們現在已經對Linux的基礎知識有了大致的了解&#xff0c;今天我們來大概講一下關于linux系統及vmware的網絡配置問題&#xff0c;在這之前&#xff0c;我們需要對網絡有一個大概的認識和了解&#xff0c;話不多說&#xff0c;我們…

01記-“計算機基礎知識”

感覺媒體: 直接作用于人的感覺器官&#xff0c;使人產生直接感覺的媒體&#xff1a;聲音、圖形、圖像、動畫等。 表示媒體: 為了加工、處理和傳輸感覺媒體而人為研究、構造出來的一種媒體&#xff0c;常見的有各種編碼方式&#xff0c;如文本編碼、圖像編碼和聲音編碼等。 …

Java中靜態方法為什么不能調用非靜態成員?

在Java面試中&#xff0c;這個問題經常被問到&#xff0c;因為它不僅涉及到Java的基本語法規則&#xff0c;還深入到了JVM的工作機制。理解這個問題可以幫助面試者更好地掌握Java的靜態和非靜態成員的區別以及它們在內存中的分配和使用。 靜態成員 vs 非靜態成員 首先&#x…

AtCoder Beginner Contest 318 A題 Full Moon

A題&#xff1a;Full Moon 標簽&#xff1a;模擬、數學題意&#xff1a;給定一個起始 m m m和上限 n n n&#xff0c;每次增量 p p p&#xff0c;求能加幾次。題解&#xff1a;數據比較小&#xff0c;可以直接暴力&#xff1b;數學方法算的話&#xff0c;注意邊界。代碼&#…

HNU-算法設計與分析-作業5

第五次作業【回溯算法】 文章目錄 第五次作業【回溯算法】<1> 算法分析題5-3 回溯法重寫0-1背包<2> 算法分析題5-5 旅行商問題&#xff08;剪枝&#xff09;<3> 算法實現題5-2 最小長度電路板排列問題<4> 算法實現題5-7 n色方柱問題<5> 算法實現…

時間格式數據向前或向后歸于整時

假設你有一個“時:分:秒”的時間格式數據&#xff0c;例如"12:34:56"&#xff0c;你想要將它向前歸整于整時或者向后歸整于整時&#xff0c;可以按照以下方法進行處理&#xff1a; 1、向前歸整于整時&#xff1a;將分鐘和秒數設置為0 import datetime# 原始時間 ti…

公共字段填充(AOP的使用)

Thread是線程池,ThreadLocal是線程變量,每個線程變量是封閉的,與其它線程變量分隔開來,在sky-common下的com.sky.context包下有一個Basecontext類 public class BaseContext {//每一個上下文創建了一個線程變量,用來存儲long類型的id//創建三個方法,用來設置,取用,刪除idpubli…