如何在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()
{
}
}
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