Resource.Load不会加载Unity中的最新文件

时间:2014-02-17 21:09:53

标签: c# image unity3d

我正在使用Resource.Load加载游戏中截图的图片。播放器拍摄一张照片(屏幕截图),保存为png文件,然后将该图像加载到GUI框中并显示在屏幕上,并可以使用右箭头和左箭头更改为下一个或上一个图像。加载到GUI框中的图像只是在游戏运行之前存在于Resources文件夹中的图像。这意味着玩家只能查看上次播放会话中的图像,而不能查看当前播放的图像。我希望能够找到关于如何修复错误的一些见解,因为我不知道是什么导致了它。任何帮助将不胜感激,代码发布如下:

截图代码:

void SavePNG()
{
    Debug.Log("Start Capture");
    picCount += 1;

    var width = Screen.width;
    var height = Screen.height;

    Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);

    RenderTexture rt = new RenderTexture(width, height, 24);
    cam2.targetTexture = rt;
    cam2.Render();
    RenderTexture.active = rt;

    // Read pixels
    tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);

    // Clean up
    cam2.enabled = false;
    cam2.targetTexture = null;
    RenderTexture.active = null; // added to avoid errors 
    DestroyImmediate(rt);

    var bytes = tex.EncodeToPNG();
    Destroy (tex);     

    File.WriteAllBytes(Application.dataPath + "/../Assets/Resources/" + picCount + ".png", bytes);

    Debug.Log("Captured");
    Debug.Log("Pic Count: " + picCount);
}

GUI代码:

public class UserInterface : MonoBehaviour
{
    public Texture ghostPic;

    private int photoList;
    private int photoNum;
    private string photoString;

    int picHeight;
    int picWidth;

    void Start()
    {
        photoNum = Screenshot.picCount;
        photoList = 0;

        picHeight = Screen.height - 160;
        picWidth = 10;
    }

    void Update()
    {
        photoNum = Screenshot.picCount;

        if(Input.GetButtonDown("Next") && photoNum > 0)
        {
            //Debug.Log("Next");
            photoList++;

            if(photoList == photoNum + 1)
            {
                photoList = 1;
            }

            Debug.Log("Photo List: " + photoList);

            ChangeImage();
        }

        if(Input.GetButtonDown("Last"))
        {
            //Debug.Log("Last");
            photoList--;

            if(photoList == 0)
            {
                photoList = photoNum;
            }

            Debug.Log("Photo List: " + photoList);

            ChangeImage();
        }
    }

    void ChangeImage()
    {
        photoString = photoList.ToString();
        ghostPic = Resources.Load(photoString) as Texture;
    }

    void OnGUI()
    {
        GUI.Box(new Rect(picWidth, picHeight, 300, 150), ghostPic);
    }
}

感谢您的时间:)

ETA:

好的,现在我正在使用Environment.GetFolderPath(Environment.SpecialFolder.Personal) 访问我的文档。我试图将其写入字符串变量,但不确定这是否正确:

url = Environment.GetFolderPath(Environment.SpecialFolder.Personal)

但现在的问题是图像不再保存到文件或从文件加载。我已经包含了新代码,但看起来ChangeImage()函数没有在图像加载器中运行,我不明白为什么:

void Start()
    {
        url = Environment.GetFolderPath(Environment.SpecialFolder.Personal);

        photoNum = Screenshot.picCount;
        photoList = 0;

        picHeight = Screen.height - 160;
        picWidth = 10;

        photoString = "0";

        ChangeImage();
    }

    void Update()
    {
        photoNum = Screenshot.picCount;

        if(Input.GetButtonDown("Next") && photoNum > 0)
        {
            Debug.Log("Next");
            photoList++;

            if(photoList == photoNum + 1)
            {
                photoList = 1;
            }

            ChangeImage();
        }

        if(Input.GetButtonDown("Last"))
        {
            Debug.Log("Last");
            photoList--;

            if(photoList <= 0)
            {
                photoList = photoNum;
            }

            ChangeImage();
        }

    }

    void ChangeImage()
    {

        photoString = photoList.ToString();
        WWW www = new WWW(url + photoString);

        WaitForLoad();

        if (isDone)
        {
            www.LoadImageIntoTexture(ghostPic);
            Debug.Log("Photo List: " + photoList);
            Debug.Log("Photo String: " + photoString);

            isDone = false;
        }
    }

    IEnumerator WaitForLoad()
    {
        yield return new WaitForFixedUpdate();

        isDone = true;
    }

    void OnGUI()
    {
        GUI.Box(new Rect(picWidth, picHeight, 300, 150), ghostPic);
    }

我也在使用Environment.GetFolderPath(Environment.SpecialFolder.Personal 保存图像。代码与上面相同,增加了Environment.Get ......等等,第28行现在是:

File.WriteAllBytes(url + picCount + ".png", bytes);

我假设我错误地使用了这个,但我不太清楚如何。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:0)

存储在名为Resources的文件夹中的所有资源都将打包到构建中的单个文件中。 这意味着Resources.Load()需要相对于Resources文件夹的路径来加载资源,并且资产名称对于任何其他Resource文件夹中的任何其他资产都是唯一的。

答案 1 :(得分:0)

问题在于:

url = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
[...]
WWW www = new WWW(url + photoString);

WWW需要一个URI(例如file://home/user/),其中Environment.GetFolderPath会返回文件系统路径(例如/home/user)。

所以

WWW www = new WWW("file://" + url + photoString);

应该做的伎俩。除非您使用的是Windows,否则您需要执行以下操作:

WWW www = new WWW("file:///" + url + photoString);

(注意三个斜杠而不是两个)

请参阅: http://docs.unity3d.com/ScriptReference/WWW.html