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

如何合并卡牌重复Buff的数值?C#代码实现需求

解决方案

要实现重复Buff类型的数值合并,核心是先解析每个Buff的数值、单位和类型,再按类型分组求和,最后重新生成显示字符串。以下是修改后的完整代码:

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class CardBuffSystem : MonoBehaviour
{
    public TMPro.TMP_Text CardText; // 可替换为Unity原生Text组件

    void GenerateCardBuffs()
    {
        string[] chosenBuffs = new string[3]; // 存储选中的所有Buff

        // 所有Buff选项
        string[] positiveBuffs = { "+5 Max HP", "+10 Max HP" };
        string[] randomBuffs = { "+3 Max HP", "-3% FireRate" };
        string[] negativeBuffs = { "-4% FireRate", "-6% FireRate" };

        // 随机抽取Buff(修正原拼写错误:NagitiveBuffs → negativeBuffs)
        int buffChance1 = UnityEngine.Random.Range(0, positiveBuffs.Length);
        int buffChance2 = UnityEngine.Random.Range(0, randomBuffs.Length);
        int buffChance3 = UnityEngine.Random.Range(0, negativeBuffs.Length);

        // 存储选中的Buff
        chosenBuffs[0] = positiveBuffs[buffChance1];
        chosenBuffs[1] = randomBuffs[buffChance2];
        chosenBuffs[2] = negativeBuffs[buffChance3];

        // 解析并合并Buff
        var buffGroups = new Dictionary<string, (float value, string unit)>();

        foreach (string buffStr in chosenBuffs)
        {
            // 解析单个Buff字符串
            if (TryParseBuff(buffStr, out float value, out string unit, out string type))
            {
                if (buffGroups.ContainsKey(type))
                {
                    // 类型已存在,累加数值
                    var existing = buffGroups[type];
                    buffGroups[type] = (existing.value + value, existing.unit);
                }
                else
                {
                    // 新类型,添加到字典
                    buffGroups[type] = (value, unit);
                }
            }
        }

        // 重新生成合并后的Buff字符串列表
        var mergedBuffs = new List<string>();
        foreach (var group in buffGroups)
        {
            string sign = group.Value.value >= 0 ? "+" : ""; // 正数显示+,负数保留原有符号
            mergedBuffs.Add($"{sign}{group.Value.value}{group.Value.unit} {group.Key}");
        }

        // 设置卡牌文本(用换行分隔多个Buff)
        CardText.text = string.Join("\n", mergedBuffs);
    }

    // 解析Buff字符串的工具方法
    private bool TryParseBuff(string buffStr, out float value, out string unit, out string type)
    {
        value = 0;
        unit = "";
        type = "";

        // 拆分字符串:分离数值部分和类型部分
        int firstSpaceIndex = buffStr.IndexOf(' ');
        if (firstSpaceIndex == -1)
            return false;

        string valuePart = buffStr.Substring(0, firstSpaceIndex);
        type = buffStr.Substring(firstSpaceIndex + 1).Trim();

        // 分离数值和单位(适配带%的百分比类型)
        int unitStartIndex = 0;
        while (unitStartIndex < valuePart.Length && 
               (char.IsDigit(valuePart[unitStartIndex]) || valuePart[unitStartIndex] == '+' || valuePart[unitStartIndex] == '-'))
        {
            unitStartIndex++;
        }

        if (unitStartIndex == 0 || unitStartIndex == valuePart.Length)
            return false;

        string valueStr = valuePart.Substring(0, unitStartIndex);
        unit = valuePart.Substring(unitStartIndex);

        return float.TryParse(valueStr, out value);
    }
}

关键部分说明

  • Buff解析方法TryParseBuff:精准拆分Buff字符串为数值、单位和类型,同时支持无单位的数值类Buff(如Max HP)和带%的百分比类Buff(如FireRate)。
  • 字典分组求和:以Buff类型为键,存储对应类型的累计数值和单位,遇到重复类型直接累加数值。
  • 显示字符串重构:对正数主动添加+号优化视觉体验,负数保留原有符号,最后用换行拼接成卡牌显示文本。

原代码错误修正

  • 拼写错误:NagitiveBuffs修正为negativeBuffs
  • 赋值错误:原代码直接将数组赋值给文本组件,改为用string.Join合并后的Buff列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:34:51