Unity C#实例化对象与控制台输出不一致问题排查
问题分析与修复方案
首先看你的代码逻辑,核心问题出在同一个预制体的RawImage纹理被重复赋值了:
你在外层col循环里实例化每个预制体后,先进入内层row循环,在这个循环里你已经根据条件设置了img.texture(比如符合条件时设为RED的NewTexture[1]),并且打印了对应的日志。但内层循环结束后,你又执行了一段独立的if(sum1 == sum2)判断,再次给同一个img赋值纹理——这就会把之前在内层循环里设置的RED纹理给覆盖掉,最终导致所有预制体都显示最后一次赋值的BLUE。
举个例子:第四个预制体在内层循环里满足条件被设为RED,控制台也打印了RED的日志,但内层循环结束后,sum1 != sum2,所以代码执行了else分支,把纹理又改回了BLUE,这就造成了日志和实际显示不符的情况。
修复步骤
你需要调整代码逻辑,避免重复赋值同一个预制体的纹理。具体来说,要确认什么时候应该设置纹理,确保每个预制体只被赋值一次,或者让后续的赋值逻辑不会覆盖之前的正确设置。
方案1:移除外层的重复赋值逻辑
如果内层循环已经处理了所有预制体的纹理设置,那么外层的if(sum1 == sum2)判断就是多余的,直接删除这段代码即可:
// 删掉这段会覆盖纹理的冗余代码 /* if(sum1 == sum2) { img.texture = NewTexture[1]; p.SetActive(true); redcounter++; print("RED ARE NOW AT:" + redcounter); } else { img.texture = NewTexture[0]; p.SetActive(true); bluecounter++; print("BLUE ARE NOW AT:" + bluecounter); } */
方案2:调整逻辑,让外层赋值只处理未被内层设置的情况
如果外层的判断是用来处理某些特殊场景(比如内层循环没有进入纹理设置分支的情况),那么可以加一个标记,判断内层是否已经设置过纹理,外层只处理未设置的情况:
// 在外层循环开始时添加一个标记,记录当前预制体是否已设置纹理 bool isTextureSet = false; for(int row = 0; row < table.GetLength(1); row++){ // ... 内层循环原有代码 ... if(data1 != null && data2 != null && data3 != null && data4 != null) { img.texture = NewTexture[1]; p.SetActive(true); redcounter++; print("RED ARE NOW AT:" + redcounter); isTextureSet = true; // 标记已设置纹理 } else { img.texture = NewTexture[0]; p.SetActive(true); bluecounter++; print("BLUE ARE NOW AT:" + bluecounter); isTextureSet = true; // 标记已设置纹理 } // ... 内层循环其他代码 ... } // 外层只处理未设置过纹理的情况 if(!isTextureSet){ if(sum1 == sum2) { img.texture = NewTexture[1]; p.SetActive(true); redcounter++; print("RED ARE NOW AT:" + redcounter); } else { img.texture = NewTexture[0]; p.SetActive(true); bluecounter++; print("BLUE ARE NOW AT:" + bluecounter); } }
额外调试建议
- 可以给每个实例化的预制体添加名称标记(比如
p.name = $"BigEye_Prefab_{col}"),这样在Hierarchy面板里能直观看到每个预制体对应的循环索引,方便定位问题。 - 把
sum1、sum2这类临时变量的初始化放在外层循环的开头,避免上一轮循环的残留值影响当前循环的判断逻辑。
内容的提问来源于stack exchange,提问作者Ginxxx
相关产品推荐
相关产品推荐

