如何合并卡牌重复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
相关产品推荐
相关产品推荐

