Unity序列化和编码精灵

时间:2019-03-06 08:37:50

标签: unity3d serialization encoding sprite

我正在尝试在Android设备上下载并保存文件。在PC上工作正常,但我的Android手机上有视觉错误。请看屏幕

我的代码: 这就是我下载并序列化它的方式

Icon = Sprite.Create(texture2dd, new Rect(0.0f, 0.0f, texture2dd.width, texture2dd.height), new Vector2(0.5f, 0.5f), 100.0f);

byte[] texturebytes = Icon.texture.GetRawTextureData();
File.WriteAllText(Application.persistentDataPath + "/icon", Encoding.Default.GetString(texturebytes));
File.WriteAllText(Application.persistentDataPath + "/iconinfo", Icon.texture.width + "@@@" + Icon.texture.height);

这就是我稍后尝试加载的方式:

string[] info = File.ReadAllText(path + "info").Split(new string[] { "@@@" }, StringSplitOptions.None);
int width, height;
int.TryParse(info[0], out width);
int.TryParse(info[1], out height);
byte[] bytesIcon = Encoding.Default.GetBytes(File.ReadAllText(path));
Texture2D iconText = new Texture2D(width, height, TextureFormat.ARGB32, false);
iconText.LoadRawTextureData(bytesIcon);
iconText.Apply();
return Sprite.Create(iconText, new Rect(0, 0, width, height), new Vector2(0.5f, 0.5f));

我认为编码类型存在问题,但是我尝试了所有编码类型,但仍然无法正常工作,并加载了一些错误纹理。

1 个答案:

答案 0 :(得分:0)

您应该实际将其保存为GetRawTextureData()LoadRawTextureData格式,而不是使用.png.jpg!与纯.jpg.png文件数据相比,“ RawTextureData”非常庞大。


请改为使用EncodeToPNG(如果质量不是那么重要,则使用EncodeToJPG-而不要忘记也采用文件结尾)和LoadImage

此外,LoadImage实际上“知道”图像大小(因为它已编码到pngjpg文件中),因此无需使用iconinfo文件全部!

类似

// ...
Icon = Sprite.Create(texture2dd, new Rect(0.0f, 0.0f, texture2dd.width, texture2dd.height), Vector2.one * 0.5f, 100.0f);

byte[] texturebytes = Icon.texture.EncodeToPNG();
File.WriteAllText(Application.persistentDataPath + "/icon.png", Encoding.Default.GetString(texturebytes));
// ...

(也许还会签出this answer来获取其他写入文件的方法。)

// ...
byte[] bytesIcon = Encoding.Default.GetBytes(File.ReadAllText(path));
// as the example in the documentation states:
//   Texture size does not matter, since
//   LoadImage will replace it with incoming image size.
Texture2D iconText = new Texture2D(2, 2);
iconText.LoadImage(bytesIcon);
// Also from the documentation:
//   Texture will be uploaded to the GPU automatically; there's no need to call Apply.
return Sprite.Create(iconText, new Rect(0, 0, iconText.width, iconText.height), Vector2.one * 0.5f);

是的,另一个问题可能仍然是您使用了Encoding.Default(请参阅here),因此也许您还应该使用Encoding.UTF8之类的固定编码。


尽管要加载文件,但实际上我更喜欢使用UnityWebRequest,它也可以用于本地文件存储中的文件!