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
相关产品推荐
相关产品推荐

