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

Unity(C#)中无法将Texture2D赋值给RawImage:空引用异常

Unity中Google街景API纹理赋值RawImage空引用问题排查方案

核心排查点及解决步骤

1. 先确认RawImage引用是否有效

这是最常见的原因,别只盯着Texture2D看,先查RawImage本身:

  • 检查脚本挂载的GameObject上必须添加RawImage组件,没加的话直接在Inspector面板里添加。
  • 推荐用序列化字段拖入引用,比动态获取更稳妥:
    [SerializeField] private RawImage _streetViewRawImage; // 直接在Inspector里拖入目标RawImage组件
    
    如果用GetComponent<RawImage>(),要确保脚本挂载的对象确实包含该组件;临时测试也可以用FindObjectOfType<RawImage>()(不推荐频繁使用)。
  • 赋值前一定要加空判断,定位问题:
    if (_streetViewRawImage == null)
    {
        Debug.LogError("RawImage引用为空!检查组件是否存在或引用是否正确");
        return;
    }
    

2. 确保在主线程且异步下载完成后赋值

Google街景API请求基本是异步操作,Unity的UI组件只能在主线程操作,如果在回调外赋值或下载未完成就赋值,大概率出问题:

using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using System.IO;

public class StreetViewLoader : MonoBehaviour
{
    [SerializeField] private RawImage _streetViewRawImage;
    [SerializeField] private string _streetViewApiUrl; // 填入你的Google街景API地址

    private void Start()
    {
        StartCoroutine(DownloadAndSaveStreetView());
    }

    private IEnumerator DownloadAndSaveStreetView()
    {
        using (UnityWebRequest webRequest = UnityWebRequestTexture.GetTexture(_streetViewApiUrl))
        {
            yield return webRequest.SendWebRequest();

            if (webRequest.result != UnityWebRequest.Result.Success)
            {
                Debug.LogError($"下载失败:{webRequest.error}");
                yield break;
            }

            // 获取下载的纹理
            Texture2D streetTexture = DownloadHandlerTexture.GetContent(webRequest);
            if (streetTexture == null)
            {
                Debug.LogError("下载的纹理为空");
                yield break;
            }

            // 保存纹理到本地(用Unity推荐的持久化路径,避免权限问题)
            byte[] pngData = streetTexture.EncodeToPNG();
            string savePath = Path.Combine(Application.persistentDataPath, "StreetView_" + System.DateTime.Now.Ticks + ".png");
            File.WriteAllBytes(savePath, pngData);
            Debug.Log($"图片已保存到:{savePath}");

            // 赋值给RawImage(此时确保在主线程,且RawImage引用有效)
            if (_streetViewRawImage != null)
            {
                _streetViewRawImage.texture = streetTexture;
            }
        }
    }
}

3. 检查Texture2D的可读状态

如果是自己创建的Texture2D(而非UnityWebRequest下载的),创建时必须开启可读属性:

Texture2D customTex = new Texture2D(2, 2, TextureFormat.RGBA32, true); // 最后一个参数true表示可读

UnityWebRequestTexture下载的纹理默认是可读的,这条主要针对自定义纹理的场景。

4. 排查编辑器显示与运行时状态差异

编辑器里看到Texture2D有图,不代表运行时状态完全正常:

  • 在赋值前加Debug.Log($"纹理尺寸:{streetTexture.width}x{streetTexture.height}");,如果输出正常尺寸,说明纹理确实加载完成。
  • 检查是否有其他脚本在修改RawImage的引用,比如场景切换时对象被销毁,导致引用失效。

内容的提问来源于stack exchange,提问作者Carl44

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:05:29