You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#重写泛型方法返回正常但对应局部参数仍为Null如何解决

问题原因

  • 核心问题是你调用GetClosestEnemy方法后,没有将方法返回的结果赋值给closestBadSoldier成员变量,方法执行得到的正确结果直接被丢弃,变量自然保持初始的null值。
  • 附加冗余问题:你定义的泛型参数soldierType没有实际作用,FindObjectsOfType<T>只需要指定泛型类型即可,不需要传入对应类型的实例作为参数,你当前传初始为null的closestBadSoldier进去也不会影响结果,属于无效设计。
  • 子类中重写的GetClosestEnemy方法没有额外逻辑,完全多余,可直接删除调用基类方法即可。

解决方法

基础修复(直接解决空引用问题)

修改子类Update中的调用逻辑,接收方法返回值:

void Update()
{
     closestBadSoldier = GetClosestEnemy<BadSoldier>(closestBadSoldier);
}

优化版本(清理冗余代码)

  1. 先修改基类方法,删除无用参数:
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;
    }
}
  1. 删掉子类中多余的重写方法,调整调用逻辑:
public class GoodSoldier : Soldier
{
    public BadSoldier closestBadSoldier = null;

    void Update()
    {
        // 直接调用基类的泛型方法,接收返回值赋值给成员变量
        closestBadSoldier = GetClosestEnemy<BadSoldier>();
    }
}

额外性能提示:如果不需要每帧更新最近敌人,建议把查找逻辑放到定时调用里(比如用InvokeRepeating每隔0.2~0.5秒调用一次),避免每帧执行FindObjectsOfType带来的性能损耗。

内容的提问来源于stack exchange,提问作者Deniz Demir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:45:08