从Uint64List字节生成Unity Texture2D失败,求解决方案
问题分析与解决方案
你的核心问题出在二进制数据的编码传输和Unity纹理加载方式两个环节,具体修正如下:
1. Flutter端:修正字节数据的编码方式
你当前把ByteData转成Uint64List再转字符串的操作会破坏原始图片的字节结构——Uint64List是将8字节打包为64位整数,转字符串时的编码逻辑完全不符合二进制数据的安全传输要求。正确的做法是直接使用原始的Uint8List并通过Base64编码转为字符串:
final ByteData data = await NetworkAssetBundle(Uri.parse(lastPosts.docs[0]['mediaUrl'][0])).load(lastPosts.docs[0]['mediaUrl'][0]); // 直接获取原始图片字节的Uint8List,不要转Uint64List final Uint8List imageBytes = data.buffer.asUint8List(); // 将二进制数据编码为Base64字符串,这是跨平台传输二进制数据的标准方式 String base64Image = base64Encode(imageBytes); // 将base64Image发送至Unity端
2. Unity端:修正纹理加载逻辑
你之前用LoadRawTextureData是错误的——这个方法需要的是解码后的像素原始数据(比如每个像素占4字节的RGBA数组),而不是PNG/JPG这类压缩图片的文件字节。正确的做法是用LoadImage方法直接解析压缩的图片字节:
if (!string.IsNullOrEmpty(fl_data)) { // 将Base64字符串解码回原始图片字节 byte[] imgBytes = Convert.FromBase64String(fl_data); // 创建尺寸为0的纹理,LoadImage会自动根据图片实际尺寸调整 Texture2D tex = new Texture2D(0, 0, TextureFormat.ARGB32, false); // 加载并解析图片字节,返回是否成功 bool isLoaded = tex.LoadImage(imgBytes); if (isLoaded) { tex.Apply(); m_screenTexture.texture = tex; } else { Debug.LogError("图片字节解析失败,请检查数据传输是否完整"); } }
关键说明
- Base64编码是跨平台传输二进制数据的标准方案,能避免字节转字符串时的编码丢失问题;
LoadImage会自动处理PNG、JPG等常见图片格式的解码,无需手动解析像素数据,而LoadRawTextureData仅适用于已解码的像素数组场景。
内容的提问来源于stack exchange,提问作者RoyalCoder
相关产品推荐
相关产品推荐

