<div style="padding:15px 15px 2px 20px; border-radius:2px; margin-bottom:20px; border:1px solid #ddd">

<callout>
<p style="margin-bottom:0.75em"><b>Licensing</b></p>!!
将 Spine 官方运行时整合到自建应用程序中[需要持有 Spine 许可证](/git/spine-runtimes/spine-unity#licensing).
</callout>

<div style="font-size: 1.6em; margin: 0 0 .5em;">spine-unity 运行时文档</div>!!
* [安装运行时](/spine-unity-installation)
* [示例](/spine-unity-examples)
* [资产](/spine-unity-assets)
* [主要组件](/spine-unity-main-components)
* [工具组件](/spine-unity-utility-components)
* [渲染](/spine-unity-rendering)
* [时间轴扩展 UPM 软件包](/spine-unity-timeline)
* [懒加载扩展 UPM 软件包](/spine-unity-on-demand-loading)
* [常见问题(FAQ)](/spine-unity-faq)
</div>!!

# 懒加载扩展 UPM 软件包

## 为何使用懒加载(按需加载)

您的项目可能需要在每个skeleton上使用大量的皮肤和atlas页textures, 但只有小部分需要在启动时加载. 我们注意到, 所有atlas textures均通过[SkeletonDataAsset](/spine-unity-assets#Skeleton-Data资产)间接引用, 因此会在加载skeleton时将其一并加载. 这与Unity的标准加载行为一致.

为了优化内存占用和App下载体积, 可使用懒加载UPM包在运行时动态加载texture.
它可以与[Unity Addressables](https://learn.unity.com/course/get-started-with-addressables)等组件集成, 仅在应用了皮肤后再下载其对应的高分辨率atlas textures. 该功能以轻微的运行时加载延迟为代价, 减少初始加载体积.

## UPM包

Spine-Unity的懒加载功能可通过独立的Unity包管理器(UPM)扩展包获取. 目前提供两种UPM包：
* [Addressables UPM包](#Addressables-UPM包) `com.esotericsoftware.spine.addressables`  
    基于[Unity Addressables](https://learn.unity.com/course/get-started-with-addressables)的开箱即用方案.
* [懒加载UPM包](#懒加载UPM包) `com.esotericsoftware.spine.on-demand-loading`  
    实现了懒加载的通用包.

# Addressables UPM包

Spine Addressables插件通过集成[Unity Addressables](https://learn.unity.com/course/get-started-with-addressables)系统, 为Spine-Unity运行时提供了懒加载texture的支持.

该模块可自动执行所有必要步骤, 可自动将texture替换为低分辨率占位图(placeholder), 并在需要时惰性加载高分辨率texture. 在预构建阶段将会把构建输出的texture替换为低分辨率版本, 而后构建阶段则会恢复项目中高分辨率的原始texture. 全程无需额外编码.

## 安装

Spine Addressables扩展包`com.esotericsoftware.spine.addressables`依赖于Spine懒加载扩展包`com.esotericsoftware.spine.on-demand-loading`. 请先安装懒加载包, 再安装Addressables包.

请参考[可选扩展UPM包](/spine-unity-installation#可选的UPM扩展包)章节了解如何下载安装UPM包, 以及[更新扩展UPM包](/spine-unity-installation#更新UPM扩展包)章节了解更新方法.

## 使用

如需配置将texture替换为低分辨率占位图并自动懒加载高分辨率texture, 只需执行以下步骤：
1. 将原始的高分辨率Material texture声明为[addressable](https://learn.unity.com/course/get-started-with-addressables).

![](/img/spine-runtimes-guide/spine-unity/on-demand-loading/set-texture-addressable.png)  

2. 选中`SpineAtlasAsset`, 右键点击`SpineAtlasAsset`检查器, 选择`Add Addressables Loader`.

![](/img/spine-runtimes-guide/spine-unity/on-demand-loading/add-addressable-loader.png)  

3. 这时将生成一个`AddressableTextureLoader`资产.

![](/img/spine-runtimes-guide/spine-unity/on-demand-loading/addressable-asset-created.png)  

4. 该资产提供配置参数, 并设置在预构建中自动分配的低分辨率占位图.

![](/img/spine-runtimes-guide/spine-unity/on-demand-loading/addressable-asset-inspector.png)  

5. 正常构建Addressables内容.

此后构建游戏可执行文件时, 运行时将自动初始分配低分辨率占位图, 并懒加载其高分辨率texture.

## 编辑器预览

请注意, 低分辨率texture仅在游戏构建过程中使用, 在Unity编辑器(包括Play模式)中不可见.

若想在编辑器中预览占位图效果, 可临时分配一张图以作测试: 选择`AddressableTextureLoader`资产, 点击`Testing` - `Assign Placeholders` 便可临时将高分辨率texture替换为低分辨率版本.

![](/img/spine-runtimes-guide/spine-unity/on-demand-loading/placeholders.png)  

你也可以在Play模式下观察高分辨率texture的懒加载过程. 但要注意这一修改仅用于预览, 而不会影响最终构建的可执行文件. 构建时无需手动操作, 系统会自动通过预构建步骤处理texture, 在后构建中再将原始texture恢复.

# 懒加载UPM包

Atlas textures懒加载的核心功能包含在独立的Spine懒加载扩展包`com.esotericsoftware.spine.on-demand-loading`中.
Spine Addressables插件(`com.esotericsoftware.spine.addressables`)基于此包构建, 提供了适配于Unity Addressables系统的具体实现.

请参考[可选的UPM扩展包](/spine-unity-installation#可选的UPM扩展包)一章了解如何下载安装此包, 以及[更新UPM扩展包](/spine-unity-installation#更新UPM扩展包)一章了解其更新方法.

你可以通过继承[`GenericOnDemandTextureLoader`](git/spine-runtimes/tree/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/Runtime/GenericOnDemandTextureLoader.cs)并实现抽象方法, 来定制加载方案. 可将[`AddressablesTextureLoader`](git/spine-runtimes/tree/spine-unity/Modules/com.esotericsoftware.spine.addressables/Runtime/AddressablesTextureLoader.cs)类的实现作为参考. 若`GenericOnDemandTextureLoader`无法适配你的需求, 需要进一步定制, 那么可以继承[`OnDemandTextureLoader`](git/spine-runtimes/tree/spine-unity/Assets/Spine/Runtime/spine-unity/Asset%20Types/OnDemandTextureLoader.cs)并更改实现, 以满足你的项目需求.

[下一节: 常见问题(FAQ)](/spine-unity-faq)
[上一节: 时间轴扩展 UPM 软件包](/spine-unity-timeline)