通过流式资产加载Spritesheet /地图集

时间:2018-09-17 04:38:32

标签: c# unity3d 2d

我正在尝试通过利用流媒体资产在我的Unity游戏中进行一定程度的修改。我可以导入单个精灵,没问题,但是我不确定如何将导入的流媒体资产精灵设置为“精灵模式”:将多个精灵分割成多个子部分。

这是我现在用于导入的测试类:

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;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您不能只将Sprite工作表放在StreamingAssets文件夹中并期望直接在构建中访问它。由于Sprite工作表为Unity格式,因此您必须使用Unity的资源/资产API之一来访问它。有两种方法可以做到这一点:

1 。使用Resources API。这意味着您必须使用Resources文件夹而不是StreamingAssets文件夹。将Sprite地图集放在Resources文件夹中,然后按以下步骤阅读:

Sprite[] sprite = Resources.LoadAll<Sprite>("spriteFile") as Sprite[];

2 。如果要使用StreamingAssets文件夹,则必须将Sprite工作表构建为Assetbundle,然后使用AssetBundle API在运行时读取它。 AssetBundle.LoadAssetWithSubAssetsAssetBundle.LoadAssetWithSubAssetsAsync(推荐)功能用于加载Sprite地图集。

post显示了如何构建AssetBundle。忽略加载部件,因为加载精灵图集与加载普通纹理不同。生成后,请参见下文了解如何加载。子画面图集存储在loadedSprites变量中:

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];
    }
}

答案 1 :(得分:0)

从 1.17.x 预览版开始,您可以使用以下语法:

myAddressableSpriteSheet.LoadAssetAsync<Sprite[]>();

myAddressableSpriteSheet 是一个 AssetReferenceTexture2D。 此功能尚未在任何地方记录,但已在 Unity forum 中提及。