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

C#赛车游戏异常:添加元素至子列表同步修改RaceManager源列表

问题根源:引用类型的赋值陷阱

嘿,这个问题我在做Unity竞速项目时也踩过坑,核心是C#中引用类型的赋值特性在搞怪:

  • List<Checkpoint>属于引用类型,当你写unpassedCPs = RaceManager.rm.checkpoints;时,并没有复制一份全新的检查点列表,只是让unpassedCPs这个变量指向了RaceManager.rm.checkpoints列表在内存中的同一个地址。
  • 所以后续执行unpassedCPs.Add(RaceManager.rm.checkpoints[0])时,你其实是在修改RaceManager的全局checkpoints列表,而不是当前RaceAgent自己的本地列表。这就导致所有车辆的RaceAgent都会看到这个被修改后的全局列表,出现“每辆车都同时把检查点加到RaceManager里”的问题。
解决方案:创建独立的列表副本

解决方法非常直接:给每个RaceAgent生成一个独立的检查点列表副本,而不是直接引用全局列表。

修改你的Setup方法代码如下:

void Setup(){ 
    // 在开始时和新一轮比赛时调用;完成时不调用
    // 关键修改:创建全局列表的副本,而非直接引用
    unpassedCPs = new List<Checkpoint>(RaceManager.rm.checkpoints); 
    if(laps > 0){ 
        // 环形赛道时为true,否则在最后一个检查点结束
        // 现在添加的是当前RaceAgent自己的unpassedCPs列表,不会影响全局的RaceManager.checkpoints
        unpassedCPs.Add(RaceManager.rm.checkpoints[0]); // 用于返回起点/终点
    }
    SetTargetCP(RaceManager.rm.checkpoints[0]); 
}

如果你已经引入了System.Linq命名空间,也可以用更简洁的写法来创建副本:

unpassedCPs = RaceManager.rm.checkpoints.ToList();

这样每个RaceAgent的unpassedCPs都是完全独立的列表,对它的任何修改都只会作用于当前车辆的本地列表,不会影响RaceManager中的全局检查点集合,问题就解决啦。

内容的提问来源于stack exchange,提问作者Mc Midas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:43:05