通过流式资产加载Spritesheet /地图集 [英] Load Spritesheet/Atlas through Streaming Assets
问题描述
我正在尝试通过利用流媒体资产在我的Unity游戏中进行一定程度的修改。我可以导入单个Sprite没问题,但是我不确定如何将导入的流式资产Sprite设置为Sprite模式:将Sprite进行多重处理并将其切片成其子部分。
I am trying to allow a degree of modding in my Unity game by utilizing streaming assets. I can import a single sprite no problem, but I am not sure how to set an imported streaming assets sprite to Sprite Mode: Multiple and slice that sprite into its sub parts.
这是我现在用于导入的测试类:
Here is a test class I am using for the import right now:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PixelsoftGames.Tools2D;
using System.IO;
public class Sandbox : MonoBehaviour
{
SpriteRenderer sRenderer = null;
private void Awake()
{
sRenderer = GetComponent<SpriteRenderer>();
}
private void Start()
{
DirectoryInfo directoryInfo = new DirectoryInfo(Application.streamingAssetsPath);
FileInfo[] allFiles = directoryInfo.GetFiles("*.*");
foreach(FileInfo file in allFiles)
if(file.Name.Contains("Laser"))
StartCoroutine("LoadSprite", file);
}
IEnumerator LoadSprite(FileInfo file)
{
if (file.Name.Contains("meta"))
yield break;
else
{
string fileWithoutExtension = Path.GetFileNameWithoutExtension(file.ToString());
string finalPath;
WWW localFile;
Texture2D texture;
finalPath = "file://" + file.ToString();
localFile = new WWW(finalPath);
Debug.Log(finalPath);
yield return localFile;
texture = localFile.texture;
texture.filterMode = FilterMode.Point;
Sprite sprite = Sprite.Create(texture as Texture2D, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f), 32f);
sRenderer.sprite = sprite;
}
}
}
推荐答案
您不能只将Sprite工作表放在StreamingAssets文件夹中并期望直接在构建中访问它。由于Sprite工作表为Unity格式,因此您必须使用Unity的资源/资产API之一来访问它。有两种方法可以做到这一点:
You can't just drop a Sprite sheet in the StreamingAssets folder and expect to access it directly in a build. Since Sprite sheet is in Unity format, you have to use one of Unity's resources/asset API to access it. There are two ways to do this:
1 。使用 资源
API。这意味着您必须使用Resources文件夹而不是StreamingAssets文件夹。将Sprite地图集放在Resources文件夹中,然后如下所示:
1.With the Resources
API. This means you must use the Resources folder instead of the StreamingAssets folder. Put the Sprite atlas in the Resources folder then read as follow:
Sprite[] sprite = Resources.LoadAll<Sprite>("spriteFile") as Sprite[];
2 。如果要使用StreamingAssets文件夹,则必须构建然后将Sprite表作为Assetbundle,然后使用 AssetBundle
API在运行时读取它。 AssetBundle.LoadAssetWithSubAssets
和 AssetBundle.LoadAssetWithSubAssetsAsync
(推荐)功能用于加载Sprite地图集。
2.If you want to use the StreamingAssets folder, you must build the Sprite sheet as Assetbundle then use the AssetBundle
API read it during run-time. The AssetBundle.LoadAssetWithSubAssets
and AssetBundle.LoadAssetWithSubAssetsAsync
(Recommended) functions are used to load Sprite atlas.
此帖子显示了如何构建AssetBundle。忽略加载部件,因为加载精灵图集与加载普通纹理不同。生成后,请参见下文了解如何加载。子画面图集存储在 loadedSprites
变量中:
This post shows how to build AssetBundle. Ignore the loading part because loading sprite atlas is different from loading a normal Texture. Once you build it, see below for how to load it. The sprite atlas is stored in the loadedSprites
variable:
public Image image;
string nameOfAssetBundle = "animals";
string nameOfObjectToLoad = "dog";
void Start()
{
StartCoroutine(LoadAsset(nameOfAssetBundle, nameOfObjectToLoad));
}
IEnumerator LoadAsset(string assetBundleName, string objectNameToLoad)
{
string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "AssetBundles");
filePath = System.IO.Path.Combine(filePath, assetBundleName);
//Load "animals" AssetBundle
var assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(filePath);
yield return assetBundleCreateRequest;
AssetBundle asseBundle = assetBundleCreateRequest.assetBundle;
//Load the "dog" Asset (Use Sprite since it's a Sprite. Use GameObject if prefab)
AssetBundleRequest asset = asseBundle.LoadAssetWithSubAssetsAsync<Sprite>(objectNameToLoad);
yield return asset;
//Retrive all the Object atlas and store them in loadedSprites Sprite
UnityEngine.Object[] loadedAsset = asset.allAssets as UnityEngine.Object[];
Sprite[] loadedSprites = new Sprite[loadedAsset.Length];
for (int i = 0; i < loadedSprites.Length; i++)
loadedSprites[i] = (Sprite)loadedAsset[i];
Debug.Log("Atlas Count: " + loadedSprites.Length);
for (int i = 0; i < loadedSprites.Length; i++)
{
Debug.LogWarning(loadedSprites[i].name);
//Do something with the loaded loadedAsset object (Load to Image component for example)
image.sprite = loadedSprites[i];
}
}
这篇关于通过流式资产加载Spritesheet /地图集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!