Unity C#从字节流加载JPG生成Sprite出现红色问号问题排查
问题核心原因
首先你读取字节的GetSprite方法存在逻辑错误:ArraySegment<byte>的Array属性返回的是创建切片时引用的完整原始字节数组(也就是整个levelFileBytes),而非你截取的从byteIndex开始、长度为length的JPG切片数据。你将完整关卡文件字节传入LoadImage方法,自然无法解析出有效纹理,最终显示红色问号。
修复方案
1. 修正GetSprite方法
将切片数据复制为独立的字节数组再返回,修改后代码如下:
private byte[] GetSprite() { int length = GetNextInt(); // 复制切片区域为独立字节数组 byte[] imageBytes = new byte[length]; Buffer.BlockCopy(levelFileBytes, byteIndex, imageBytes, 0, length); byteIndex += length; return imageBytes; }
也可以直接调用ArraySegment的ToArray()扩展方法实现相同效果:
return byteImage.ToArray();
2. 额外优化与校验点
如果修改后仍有问题,可以按以下顺序排查:
- 校验
LoadImage返回值:Texture2D.LoadImage会返回bool值表示解析是否成功,可加日志确认解析结果:bool loadResult = spriteColor.LoadImage(levelFileData.rastrBytes); Debug.Log($"图片加载结果:{loadResult}"); - 大小端一致性校验:写入长度时用的
BitConverter.GetBytes是跟随当前系统端序的,若你的游戏需要跨平台运行,建议读写长度时统一指定端序(比如固定小端),避免读取到错误的长度值。 - 本地导出校验:可以将读取到的
rastrBytes写入本地存储为.jpg文件,直接打开验证字节是否完整、有效。 - 纹理读写权限确认:确保运行环境下Texture2D的读写权限没有被限制,
LoadImage方法不需要额外读写权限,一般不会触发这个问题。
内容的提问来源于stack exchange,提问作者GoRoX98
相关产品推荐
相关产品推荐

