通过流式资产加载Spritesheet /地图集 [英] Load Spritesheet/Atlas through Streaming Assets

查看:158
本文介绍了通过流式资产加载Spritesheet /地图集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试通过利用流媒体资产在我的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆