从持久数据路径

时间:2016-02-29 08:45:42

标签: c# unity3d

我从服务器下载一些精灵并将它们存储在Application.persistentDataPath

但是,我无法使用Resources.Load (controllerPath)加载控制器,因为该路径位于Resources文件夹之外。

此外,当我尝试将动画控制器添加到MissingComponentException时,我得到GameObject

这是我的代码:

private GameObject SideSprite;

// ...

string controllerPath = Application.persistentDataPath+"/"+aux+"/"+aux+"Controller";
controller = (RuntimeAnimatorController)Resources.Load (controllerPath);  // Returns null

// Below I get:
// MissingComponentException: There is no 'Animator' attached to the
// "Missing Prefab (Dummy)" game object, but a script is trying to access it.
SideSprite.GetComponent<Animator> ().runtimeAnimatorController = controller;

我应该如何从持久数据路径加载资源?

2 个答案:

答案 0 :(得分:2)

persistentDataPath用作任何常规文件夹。我不会存储精灵,但更可能是纹理,下次你需要它时,你可以展开将纹理应用于精灵的过程:

public static void StoreCacheSprite(string url, Sprite sprite)
{
    if(sprite == null || string.IsNullOrEmpty(url) == true) { return; }
    SpriteRenderer spRend = sprite.GetComponent<SpriteRenderer>();
    Texture2D tex = spRend.material.mainTexture;
    byte[] bytes = tex.EncodeToPNG();
    string path = Path.Combine(Application.persistentDataPath, url);
    File.WriteAllBytes(Application.persistentDataPath, bytes);
}
public static Sprite GetCacheSprite(string url)
{
    if( string.IsNullOrEmpty(url) == true) { return; }
    string path = Path.Combine(Application.persistentDataPath, url);
    if(File.Exists(path) == true)
    {
        bytes = File.ReadAllBytes(path);
        Texture2D texture = new Texture2D(4, 4, TextureFormat.RGBA32, false);
        texture.LoadImage(bytes);
        Sprite sp = Sprite.Create(texture, new Rect(0,0 texture.width, texture.height, new Vector2(0.5f,0.5f));
        return sp;
    }
    return null;
}

第一种方法使用.NET中的File类存储纹理。它将字节数组转换并写入设备的ROM(File.WriteAllBytes)。你需要一个Sprite的路径和它的名字。该名称需要符合文件和文件夹路径命名。

第二种方法执行逆过程,检查它是否已经存储,并将RAM上找到的字节数组转换为可用的Sprite。

答案 1 :(得分:0)

您也可以简单地使用WWW获取数据。

string controllerPath = Application.persistentDataPath+"/"+aux+"/"+aux+"Controller";
    IEnumerator Start ()
    {
        WWW www = new WWW("file:///" + controllerPath);
        yield return www;
        Debug.Log(www.texture); //or www.bytes
    }