Unity C#仿Runescape升级系统启动默认等级为2而非1的问题
Runescape式升级系统初始等级异常问题
我正在实现一个Runescape风格的指数级升级系统,核心功能正常,但启动游戏时出现异常:默认等级显示为2而非1,同时所需XP为83(这是1级升2级的正确需求)。即使在代码或Inspector中设置currentLevel=1,系统仍会显示等级2。
问题代码
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class LevelUpSystem : MonoBehaviour { public int currentLevel; public int XP = 0; public int reqXP = 83; public TextMeshProUGUI levelGUI; public TextMeshProUGUI reqGUI; void Update() { levelGUI.text = currentLevel.ToString(); reqGUI.text = reqXP.ToString(); if (Input.GetKeyDown(KeyCode.T)) { GainXP(10); } while (XP >= reqXP) { LevelUp(); } } void GainXP(int amount) { XP += amount; Debug.Log($"Gained {amount} XP. Total XP: {XP}"); while (XP >= reqXP) { LevelUp(); } } public void LevelUp() { currentLevel++; XP -= reqXP; Debug.Log($"Level Up! New Level: {currentLevel}"); int firstPass = 0; for (int levelCycle = 1; levelCycle < currentLevel; levelCycle++) { firstPass += (int)Math.Floor(levelCycle + (300f * Math.Pow(2f, levelCycle / 7f))); Debug.Log(levelCycle); } reqXP = firstPass / 4; Debug.Log($"Required XP for next level: {reqXP}"); } }
问题根源
- XP定义混淆:代码错误地将
reqXP定义为「从1级升到当前等级的总XP」,而非「当前等级升下一级的单级需求XP」,导致初始数值逻辑混乱。 - 初始化缺失:未通过代码强制初始化初始状态,Unity的序列化机制可能保留了之前运行的错误数值,覆盖了手动设置的
currentLevel=1。 - 升级逻辑错误:
LevelUp方法通过累加总XP计算下一级需求,而非直接计算单级升级所需的XP,进一步加剧了逻辑混乱。
修复方案
1. 强制初始化初始状态
添加Start方法,确保启动时强制设置正确的初始等级、XP和升级需求:
void Start() { currentLevel = 1; XP = 0; reqXP = CalculateSingleLevelXP(currentLevel); }
2. 实现单级XP计算方法
按照Runescape官方公式,单独编写计算单级升级需求的方法:
// 计算指定等级升下一级所需的XP private int CalculateSingleLevelXP(int level) { return (int)Math.Floor( (level + 300f * Math.Pow(2f, level / 7f)) / 4f ); }
3. 修正LevelUp逻辑
移除错误的总XP累加计算,直接调用单级XP方法获取下一级需求:
public void LevelUp() { currentLevel++; XP -= reqXP; // 扣除当前等级升级XP,保留溢出部分 Debug.Log($"Level Up! New Level: {currentLevel}"); reqXP = CalculateSingleLevelXP(currentLevel); Debug.Log($"Required XP for next level: {reqXP}"); }
4. 移除重复升级检查
保留一处升级检查逻辑即可(示例中只在GainXP中处理,避免重复调用)。
修复后完整代码
using System; using UnityEngine; using TMPro; public class LevelUpSystem : MonoBehaviour { public int currentLevel; public int XP = 0; public int reqXP; public TextMeshProUGUI levelGUI; public TextMeshProUGUI reqGUI; void Start() { // 初始化初始状态:1级,0XP,需要83XP升2级 currentLevel = 1; XP = 0; reqXP = CalculateSingleLevelXP(currentLevel); } void Update() { levelGUI.text = currentLevel.ToString(); reqGUI.text = reqXP.ToString(); if (Input.GetKeyDown(KeyCode.T)) { GainXP(10); } } void GainXP(int amount) { XP += amount; Debug.Log($"Gained {amount} XP. Total XP: {XP}"); // 处理多级升级 while (XP >= reqXP) { LevelUp(); } } public void LevelUp() { currentLevel++; XP -= reqXP; Debug.Log($"Level Up! New Level: {currentLevel}"); reqXP = CalculateSingleLevelXP(currentLevel); Debug.Log($"Required XP for next level: {reqXP}"); } private int CalculateSingleLevelXP(int level) { return (int)Math.Floor( (level + 300f * Math.Pow(2f, level / 7f)) / 4f ); } }
内容的提问来源于stack exchange,提问作者Ilija Spasovic
相关产品推荐
相关产品推荐

