Unity安卓点击器游戏超大数据存储方案咨询(兼容PlayerPrefs)
解决方案
1. 替换数值存储类型为BigInteger
C#的System.Numerics.BigInteger支持任意长度整数,完全满足100位数值需求,先在代码顶部引入命名空间:
using System.Numerics;
2. 修改主脚本(代码1)
仅替换变量类型、调整PlayerPrefs读写逻辑,保留原有核心功能:
using UnityEngine; using UnityEngine.UI; using System.Numerics; public class MoneyManager : MonoBehaviour { public Text moneyText; // 替换为BigInteger类型,支持超大数值 public BigInteger money; public BigInteger moneyPerClick = 1000000; void Start() { // 从PlayerPrefs读取字符串并转为BigInteger,默认值为0 string savedMoney = PlayerPrefs.GetString("money", "0"); BigInteger.TryParse(savedMoney, out money); string savedPerClick = PlayerPrefs.GetString("moneyPerClick", "1000000"); BigInteger.TryParse(savedPerClick, out moneyPerClick); } void Update() { // 调用新增的BigInteger格式化方法 moneyText.text = FormatNumbers.formatNumber(money); } public void Click() { money += moneyPerClick; // 将BigInteger转为字符串存入PlayerPrefs PlayerPrefs.SetString("money", money.ToString()); } }
注:修复了原代码中Clik的拼写错误为Click
3. 最小化修改格式化脚本(代码2)
新增一个接收BigInteger的重载方法,完全复用原有format_name数组和格式化逻辑,几乎不改动原有代码:
using System.Numerics; public static class FormatNumbers { public static string[] format_name = new[] { "", "K", "M", "t", "q", "Q", "s", "S", "o", "n", "d", "U", "D", "T", "Qt", "Qd", "Sd", "St", "O", "N", "v", "c" }; // 保留原有float版本,兼容旧逻辑 public static string formatNumber(float num) { if (num == 0) return "0"; int i = 0; while(i+1 < format_name.Length && num >= 1000f) { num /= 1000f; i++; } return num.ToString("#.##") + format_name[i]; } // 新增BigInteger版本,复用原有格式化规则 public static string formatNumber(BigInteger num) { if (num == 0) return "0"; int i = 0; BigInteger temp = num; // 复用除以1000的循环逻辑,适配BigInteger计算 while (i + 1 < format_name.Length && temp >= 1000) { temp /= 1000; i++; } // 缩小后的数值可安全转为double进行格式化 return ((double)temp).ToString("#.##") + format_name[i]; } }
4. 扩展量级支持(可选)
如果后续需要支持超过现有format_name数组的量级,仅需在数组中添加对应的后缀(如"x", "X", "e"等),无需修改核心逻辑。
内容的提问来源于stack exchange,提问作者Mister Danila
相关产品推荐
相关产品推荐

