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

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}");
    }
}

问题根源

  1. XP定义混淆:代码错误地将reqXP定义为「从1级升到当前等级的总XP」,而非「当前等级升下一级的单级需求XP」,导致初始数值逻辑混乱。
  2. 初始化缺失:未通过代码强制初始化初始状态,Unity的序列化机制可能保留了之前运行的错误数值,覆盖了手动设置的currentLevel=1。
  3. 升级逻辑错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:47:32