You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:24:03