1 回答
TA贡献1808条经验 获得超4个赞
一般来说,你应该宁愿使用Path.Combinelike
var path = Path.Combine(Application.persistentDataPath, FileName);
代替系统路径!可能是您的目标设备根本不理解/为路径分隔符。
如果文件已经存在(也许是更新的版本?而且你已经下载了它)也可以写,或者如果它已经存在你甚至不应该开始下载以节省带宽。
我还认为这WriteAllText不是二进制图像数据的正确解决方案,因为www.downloadHandler.text已经
解释为 UTF8 字符串
因此,由于图像很可能有一些字节在 UTF8 字符串中无法表示,因此您会在此处获得损坏的数据!
你宁愿直接使用
www.downloadHandler.data
它返回原始byte[]而不是例如File.WriteAllBytes(仅在UWP上)或将其FileStream写入byte[]文件的正确方法。就像是
var data = www.downloadHandler.data;
File.WriteAllBytes(path, data);
或者
var data = www.downloadHandler.data;
using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
fs.Write(data, 0, data.Length);
}
比场景中的白色图像通常意味着精灵是null.
如果没有打字错误,那么您LoadSprite 总是returns null。你忘了归还创建的sprite
private Sprite LoadSprite(string path)
{
if (string.IsNullOrEmpty(path)) return null;
if (System.IO.File.Exists(path))
{
byte[] bytes = File.ReadAllBytes(path);
Texture2D texture = new Texture2D(900, 900, TextureFormat.RGB24, false);
texture.filterMode = FilterMode.Trilinear;
texture.LoadImage(bytes);
Sprite sprite = Sprite.Create(texture, new Rect(0, 0, 8, 8), new Vector2(0.5f, 0.0f), 1.0f);
// You should return the sprite here!
return sprite;
}
return null;
}
但是请注意,加载本地图像的更好方法实际上UnityWebRequestTexture也是如此。它还将本地文件路径作为 URL 和
与下载原始字节并在脚本中手动创建纹理相比,使用此类可显着减少内存重新分配。此外,纹理转换将在工作线程上执行。
但是也
仅支持 JPG 和 PNG 格式。
但这不应该是我想的问题,因为LoadImage到目前为止您使用的也是相同限制的基础。
但是,这将是异步的,因此您必须等待纹理才能创建精灵。因此,与其重新调整,Sprite我实际上宁愿传入相应Image组件的引用并直接替换其sprite. 就像是
private IEnumerator LoadLocalTexture(string path, Image receivingImage)
{
UnityWebRequest www = UnityWebRequestTexture.GetTexture(path);
yield return www.SendWebRequest();
if(www.isNetworkError || www.isHttpError)
{
Debug.Log(www.error);
}
else
{
var texture = ((DownloadHandlerTexture)www.downloadHandler).texture;
var sprite = Sprite.Create(texture, new Rect(0, 0, 8, 8), new Vector2(0.5f, 0.0f), 1.0f);
receivingImage.sprite = sprite;
}
}
如果您实际上并不一定要使用,Sprites我总是建议您RawImage改用可以直接使用的组件Texture2D!而不是做类似的事情
private IEnumerator LoadLocalTexture(string path, RawImage receivingImage)
{
UnityWebRequest www = UnityWebRequestTexture.GetTexture(path);
yield return www.SendWebRequest();
if(www.isNetworkError || www.isHttpError)
{
Debug.Log(www.error);
}
else
{
var texture = ((DownloadHandlerTexture)www.downloadHandler).texture;
receivingImage.texture = texture;
}
}
但是也
注意:请记住,使用 RawImage 会在每个 RawImage 出现时创建一个额外的绘制调用,因此最好仅将其用于背景或临时可见图形。
- 1 回答
- 0 关注
- 104 浏览
添加回答
举报