战争游戏多建筑同时建造计时功能实现问题求助
多建筑同时建造计时问题解决方案
我正在开发一款战争类游戏,玩家可购买指定建筑并自由放置,选定位置后建筑开始建造,达到指定时长后完成并显示。目前遇到的核心问题是无法实现多个建筑同时建造时的计时功能,尝试用数组实现但未成功。
现有代码的核心问题
- 依赖
howManyAreBuilding作为数组索引,导致Update中仅能处理最后一个加入的建造任务,前面的建筑完全被忽略 - 全局变量
ElapsedTimeCalculatorPassed一旦设为true,所有后续建筑都无法初始化计时逻辑 - 仅判断了
CIV类型的最后一个建造项,其他建筑类型或更早的任务得不到处理
修复方案:用封装类+列表管理建造任务
最合理的方式是把每个建筑的建造信息封装成独立对象,用列表统一管理所有正在进行的建造任务,彻底解决数组同步和全局变量冲突的问题。
1. 定义建造数据封装类
// 单个建筑的建造任务数据 public class BuildingConstruction { public string BuildingType; // 建筑类型(如"CIV") public int StartDay; // 开始建造的天数 public int RequiredDays; // 所需建造时长(天数) public Vector3 PlacementPosition; // 玩家选定的放置位置(可选,用于完成后生成建筑) }
2. 替换原有数组为列表
// 替换原来的whichBuildBought、boughtBuildingTime、elapsedTime数组 private List<BuildingConstruction> ongoingConstructions = new List<BuildingConstruction>(); private const int MaxConcurrentBuilds = 4; // 最多同时建造4个建筑
3. 修改购买建筑的逻辑
public void BuyBuilding(string whichBuilding) { if (whichBuilding == "CIV") { // 检查数量限制、购买状态、同时建造上限、资金是否充足 if (CIVQUANT < MaxCivQuant && !decidedNotToBuy && ongoingConstructions.Count < MaxConcurrentBuilds) { if (ELEM.Money >= 10000) { // 扣除购买资金 ELEM.Money -= 10000; // 新增建造任务到列表 ongoingConstructions.Add(new BuildingConstruction { BuildingType = whichBuilding, StartDay = time.OnDayChanged, RequiredDays = 20, // CIV建筑需要20天完成 PlacementPosition = /* 这里传入玩家选定的位置 */ }); } } } // 其他建筑类型可在此添加else if分支 }
4. 修改Update中的计时与完成判断
private void Update() { // 倒序遍历列表,避免移除元素时索引错乱 for (int i = ongoingConstructions.Count - 1; i >= 0; i--) { var construction = ongoingConstructions[i]; int daysPassed = time.OnDayChanged - construction.StartDay; // 检查是否达到建造时长 if (daysPassed >= construction.RequiredDays) { // 执行建造完成逻辑 if (construction.BuildingType == "CIV") { CIVQUANT++; // 根据PlacementPosition生成对应的建筑实例 } // 移除已完成的建造任务 ongoingConstructions.RemoveAt(i); } } }
方案优势
- 每个建造任务独立管理自己的开始时间和所需时长,不会互相干扰
- 遍历所有正在进行的任务,确保每个建筑的计时都能被正确处理
- 代码逻辑更清晰,后续扩展其他建筑类型或调整建造规则更方便
内容的提问来源于stack exchange,提问作者Redierro
相关产品推荐
相关产品推荐

