Unity C#技术求助:Texture数组仅能获取最后一个索引
解决Texture数组仅获取最后一个索引内容的问题
看起来你遇到的问题大概率是变量作用域重复覆盖或者异步加载时的闭包捕获问题,结合你的代码片段,我来拆解问题并给出修复方案:
问题根源分析
从你的代码片段能看到几个关键问题:
tex变量在循环外定义,每次循环都会覆盖同一个Texture2D实例,最终只会保留最后一次加载的纹理内容- 拼接
dealer_image时会在末尾多一个逗号,导致Split后出现空字符串,可能引发索引问题 - 如果后续是用异步方式加载纹理(比如
UnityWebRequest/WWW),循环变量j的捕获会导致所有异步回调都使用最后一次循环的索引值
修复后的完整代码示例
[SerializeField] GameObject[] uitex = new GameObject[4]; void GetTextureFromServer() { // 改用StringBuilder拼接字符串,更高效且避免末尾多余逗号 StringBuilder dealerImageBuilder = new StringBuilder(); foreach (var table in tzPlayInfo.Instance.bc_gametablelist) { if (dealerImageBuilder.Length > 0) { dealerImageBuilder.Append(","); } dealerImageBuilder.Append(table.dlrimage); } string[] newLinks = dealerImageBuilder.ToString().Split(',', StringSplitOptions.RemoveEmptyEntries); // 确保数组长度匹配,避免索引越界 int validCount = Mathf.Min(newLinks.Length, uitex.Length); for (int j = 0; j < validCount; j++) { // 关键:每次循环创建新的Texture2D实例,避免覆盖 Texture2D tex = new Texture2D(20, 20); string currentLink = newLinks[j]; // 假设你用UnityWebRequest加载纹理(异步场景) StartCoroutine(LoadTextureCoroutine(currentLink, tex, j)); } } IEnumerator LoadTextureCoroutine(string url, Texture2D targetTex, int index) { using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url)) { yield return www.SendWebRequest(); if (www.result == UnityWebRequest.Result.Success) { Texture2D loadedTex = DownloadHandlerTexture.GetContent(www); // 将加载的纹理赋值给对应索引的GameObject(假设是RawImage组件) RawImage rawImage = uitex[index].GetComponent<RawImage>(); if (rawImage != null) { rawImage.texture = loadedTex; } } else { Debug.LogError("加载纹理失败: " + www.error); } } }
核心修复点说明
- 每次循环创建独立的Texture2D:把
tex的定义移到循环内部,确保每个索引都有自己的纹理实例,不会被后续循环覆盖 - 优化字符串拼接:用
StringBuilder替代字符串累加,同时用StringSplitOptions.RemoveEmptyEntries自动过滤空字符串 - 异步加载时传递固定索引:在协程参数中直接传入当前循环的
index值,避免闭包捕获循环变量导致的索引错误 - 边界检查:用
Mathf.Min确保循环不会超出uitex数组的长度,避免索引越界异常
如果你的纹理加载是同步方式,只需要把加载逻辑放到循环内部,确保每个索引的GameObject对应独立的纹理实例即可。
内容的提问来源于stack exchange,提问作者Ginxxx
相关产品推荐
相关产品推荐

