我一直在使用C#制作一个用于Android的移动游戏,用户可以制作图片,然后在完成后保存他们的图片。图像将作为PNG保存到其设备中。我希望用户能够使用下一个和后退按钮查看图库文件夹中保存的所有图像,以便查看他们制作的所有图像。
我可以使用以下代码加载单个图像,但在我返回屏幕并再次进入厨房屏幕之前,它不会显示。我试过循环,但我无法让它工作。
right: 0;
}
答案 0 :(得分:0)
1)使用UnityEngine.UI.Image组件时,不要像以下那样更改图像:GetComponent<Image>().material.mainTexture = temp;
图像使用精灵。您应该设置其sprite属性,而不是更改材质。您可以使用Sprite.Create:
从纹理创建精灵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.html http://docs.unity3d.com/ScriptReference/Application-dataPath.html