我正在使用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);
我假设我错误地使用了这个,但我不太清楚如何。有人能指出我正确的方向吗?
答案 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);
(注意三个斜杠而不是两个)