C#协程运行异常求助:GetComponent<Renderer>()报错问题
问题根源与修复方案
嘿,一眼就揪出问题啦——你把model1和model2声明成了float类型,但却在调用GetComponent<Renderer>()方法!float是纯数值类型,根本没有这个成员方法,这就是报错的直接原因。
第一步:修正变量类型
把这两个变量的类型从float改成GameObject(或者直接改成Renderer更高效),这样才能正确获取渲染组件:
// 改成GameObject类型,后续可获取其Renderer组件 public GameObject model1; public GameObject model2; // 或者直接声明为Renderer,提前在编辑器赋值更高效 // public Renderer model1Renderer; // public Renderer model2Renderer;
第二步:优化协程代码(避免重复调用+空引用检查)
原代码还有两个小隐患:一是每次循环两次累加Time.deltaTime,二是没缓存Renderer组件(每帧调用GetComponent会浪费性能)。这里给你优化后的版本:
public IEnumerator colorlerpin() { // 先获取并缓存Renderer组件,避免每帧重复查找 Renderer model1Renderer = model1?.GetComponent<Renderer>(); Renderer model2Renderer = model2?.GetComponent<Renderer>(); // 空引用检查,防止后续代码崩溃 if (model1Renderer == null || model2Renderer == null) { Debug.LogError("Model 1或Model 2缺少Renderer组件!"); yield break; // 终止协程 } float elapsedTime = 0.0f; float totalTime = 1f; while (elapsedTime < totalTime) { // 淡出主模型 elapsedTime += Time.deltaTime; float fadeProgress = Mathf.Clamp01(elapsedTime / totalTime); // 确保进度始终在0-1之间 model1Renderer.material.color = Color.Lerp(Color.white, new Color(1f, 1f, 1f, 0f), fadeProgress); yield return null; // 淡入另一个模型 elapsedTime += Time.deltaTime; fadeProgress = Mathf.Clamp01(elapsedTime / totalTime); model2Renderer.material.color = Color.Lerp(new Color(1f, 1f, 1f, 0f), Color.white, fadeProgress); yield return null; } }
最后一步:编辑器赋值
别忘了在Unity编辑器里,把你要控制的模型拖到脚本组件的model1和model2插槽里,不然会触发空引用异常哦!
内容的提问来源于stack exchange,提问作者jono
相关产品推荐
相关产品推荐

