【问题标题】:Load Spritesheet/Atlas through Streaming Assets通过 Streaming Assets 加载 Spritesheet/Atlas
【发布时间】:2018-09-17 04:38:31
【问题描述】:

我正在尝试通过利用流媒体资源在我的 Unity 游戏中进行一定程度的修改。我可以导入单个精灵没问题,但我不确定如何将导入的流媒体资产精灵设置为 Sprite Mode: Multiple 并将该精灵切成其子部分。

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

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

【问题讨论】:

    标签: c# unity3d 2d


    【解决方案1】:

    您不能只是将 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];
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      myAddressableSpriteSheet.LoadAssetAsync<Sprite[]>();
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 2011-08-12
        • 1970-01-01
        • 2013-10-02
        • 2011-07-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多