C#重写泛型方法返回正常但对应局部参数仍为Null如何解决
问题原因
- 核心问题是你调用
GetClosestEnemy方法后,没有将方法返回的结果赋值给closestBadSoldier成员变量,方法执行得到的正确结果直接被丢弃,变量自然保持初始的null值。 - 附加冗余问题:你定义的泛型参数
soldierType没有实际作用,FindObjectsOfType<T>只需要指定泛型类型即可,不需要传入对应类型的实例作为参数,你当前传初始为null的closestBadSoldier进去也不会影响结果,属于无效设计。 - 子类中重写的
GetClosestEnemy方法没有额外逻辑,完全多余,可直接删除调用基类方法即可。
解决方法
基础修复(直接解决空引用问题)
修改子类Update中的调用逻辑,接收方法返回值:
void Update() { closestBadSoldier = GetClosestEnemy<BadSoldier>(closestBadSoldier); }
优化版本(清理冗余代码)
- 先修改基类方法,删除无用参数:
public abstract class Soldier : Monobehaviour { public virtual T GetClosestEnemy<T>() where T : MonoBehaviour { T[] soldiers = FindObjectsOfType<T>(); T closestSoldier = null; float dist = Mathf.Infinity; Vector3 thisPos = transform.position; foreach(T soldier in soldiers) { print("looping"); Vector3 difference = soldier.transform.position - thisPos; float currentDist = difference.sqrMagnitude; if (currentDist < dist) { print("found it"); closestSoldier = soldier; dist = currentDist; } } print(closestSoldier.gameObject.name); return closestSoldier; } }
- 删掉子类中多余的重写方法,调整调用逻辑:
public class GoodSoldier : Soldier { public BadSoldier closestBadSoldier = null; void Update() { // 直接调用基类的泛型方法,接收返回值赋值给成员变量 closestBadSoldier = GetClosestEnemy<BadSoldier>(); } }
额外性能提示:如果不需要每帧更新最近敌人,建议把查找逻辑放到定时调用里(比如用
InvokeRepeating每隔0.2~0.5秒调用一次),避免每帧执行FindObjectsOfType带来的性能损耗。
内容的提问来源于stack exchange,提问作者Deniz Demir
相关产品推荐
相关产品推荐

