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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 09:03:19