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

战争游戏多建筑同时建造计时功能实现问题求助

多建筑同时建造计时问题解决方案

我正在开发一款战争类游戏,玩家可购买指定建筑并自由放置,选定位置后建筑开始建造,达到指定时长后完成并显示。目前遇到的核心问题是无法实现多个建筑同时建造时的计时功能,尝试用数组实现但未成功。

现有代码的核心问题

  • 依赖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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:55:17