如何在Unity3D中制作自己的图库

本文关键字:自己的 Unity3D | 更新日期: 2023-09-27 18:25:57

我一直在使用C#为android制作一款手机游戏,用户可以制作一张图片,然后在完成后保存图片。图像会以PNG格式保存到他们的设备中。我希望用户能够通过"下一步"answers"上一步"按钮在图库类型的屏幕中查看保存在文件夹中的所有图像,以便查看他们制作的所有图像。

我可以使用以下代码加载一个图像,但直到我返回屏幕并再次进入厨房屏幕时,它才会显示。我试着把它循环一遍,但我无法让它发挥作用。

public class GalleryScreen : MonoBehaviour {
string[] filePaths;
int x = 0;
WWW www;
// Use this for initialization
void Start()
{
    StartCoroutine("load_image");
}
// Update is called once per frame
void Update()
{
}
IEnumerator load_image()
{
        filePaths = Directory.GetFiles(Application.dataPath + "CountryHorse/pics/", "*.png");
        www = new WWW("file://" + filePaths[x]);
        yield return www;
        Texture2D temp = new Texture2D(0, 0);
        www.LoadImageIntoTexture(temp);

        GetComponent<Image>().material.mainTexture = temp;
}
public void next()
{
    x++;
    if (x > filePaths.Length) x = 0;

}
public void back()
{
}

}

如何在Unity3D中制作自己的图库

1)使用UnityEngine.UI.Image组件时,您不会像GetComponent<Image>().material.mainTexture = temp; 那样更改图像

图像使用精灵。应该设置其sprite属性,而不是更改材质纹理。你可以使用精灵从纹理创建精灵。创建:

GetComponent<Image>().sprite = Sprite.Create(temp, new Rect(0, 0, temp.width, temp.height), Vector2.zero);

2) 在next()函数中,你的意思是也放StartCoroutine("load_image")吗?否则,你打算如何切换图像?

3) 请记住,纹理/精灵不是垃圾收集的,所以您应该确保使用Destroy函数销毁未使用的纹理/精灵。

4) 没什么大不了的,但你有一个打字错误——应该是if (x >= filePaths.Length) x = 0;,而不是if (x > filePaths.Length) x = 0;。当x == filePaths.Length时,它已经溢出。

编辑

以下是您的代码经过上述所有点的轻微修改:

public class GalleryScreen : MonoBehaviour {
    string[] filePaths;
    int x = 0;
    WWW www;
    // Use this for initialization
    void Start()
    {
        StartCoroutine("load_image");
    }
    IEnumerator load_image()
    {
        filePaths = Directory.GetFiles(Application.dataPath + "CountryHorse/pics/", "*.png");
        www = new WWW("file://" + filePaths[x]);
        yield return www;
        Texture2D temp = new Texture2D(0, 0);
        www.LoadImageIntoTexture(temp);
        var img = GetComponent<Image>();
        if (img != null) {
            if (img.sprite != null) {
                // Clean up the old textures
                Destroy(img.sprite.texture);
                Destroy(img.sprite);
            }
            GetComponent<Image>().sprite = Sprite.Create(temp, new Rect(0, 0, temp.width, temp.height), Vector2.zero);
        }
    }
    public void next()
    {
        x++;
        if (x >= filePaths.Length) x = 0;
        StartCoroutine("load_image");
    }
    public void back()
    {
        x--;
        if (x < 0) x = filePaths.Length - 1;
        StartCoroutine("load_image");
    }
}

此外,请注意,在移动平台上,Application.dataPath的行为有所不同——在Android中,只需指向apk,在iOS中,只读数据文件夹对您来说或多或少是无用的。对于您的工作模式,用户可以保存自己的图片,您应该使用Application.persistentDataPath,在那里您可以读写。如果你想在persistentDataPath之外也能读/写,例如对sdcard,你的应用程序需要额外的权限。请参阅以获取更多信息:

http://docs.unity3d.com/ScriptReference/Application-persistentDataPath.htmlhttp://docs.unity3d.com/ScriptReference/Application-dataPath.html