制作变量方法

Make variable method

我目前正在统一开发 XP 练级系统。目前我的代码有效(第一部分在 onclick 方法中):

     currentExp = Xp.LevelToXP(combat + 1);

     if (combatExp + 5 < currentExp)
     {
         combatExp += 5;
         if (previousExp == 0)
         {
             float fill = (float)(currentExp) / 100;
             XpBar.fillAmount += (5 / fill) / 100;
         }
         else
         {
             float fill = (float)(currentExp - previousExp) / 100;
             XpBar.fillAmount += (5 / fill) / 100;
         }
     }
     else if (combatExp + 5 == currentExp)
     {
         combatExp += 5;
         combat++;
         previousExp = currentExp;
         XpBar.fillAmount = 0;
     }
     else if (combatExp + 5 > currentExp)
     {
         combatExp += 5;
         combat++;
         previousExp = currentExp;
         XpBar.fillAmount = 0;
         float remainingExp = (float)combatExp - currentExp;
         XpBar.fillAmount += (remainingExp / currentExp) / 100f;
     }
     txtCombatLvl.text = "Combat Level: " + combat;

这是按下按钮时发生的情况。

但是当我尝试将所有这些放在一个方法而不是 onclick 方法中时

 void AddExp (int skill, int skillExp, int expAmount)
 {
     currentExp = Xp.LevelToXP(skill + 1);

     if (skillExp + expAmount < currentExp)
     {
         skillExp += expAmount;
         if (previousExp == 0)
         {
             float fill = (float)(currentExp) / 100;
             XpBar.fillAmount += (expAmount / fill) / 100;
         }
         else
         {
             float fill = (float)(currentExp - previousExp) / 100;
             XpBar.fillAmount += (expAmount / fill) / 100;
         }
     }
     else if (skillExp + expAmount == currentExp)
     {
         skillExp += expAmount;
         skill++;
         previousExp = currentExp;
         XpBar.fillAmount = 0;
     }
     else if (skillExp + expAmount > currentExp)
     {
         skillExp += expAmount;
         skill++;
         previousExp = currentExp;
         XpBar.fillAmount = 0;
         float remainingExp = (float)skillExp - currentExp;
         XpBar.fillAmount += (remainingExp / currentExp) / 100f;
     }
 }

我尝试通过这样调用它来访问它:

AddExp(combat, combatExp, 5);

none 我的战斗经验和等级没有保存。有人可以指出我正确的方向吗,因为 none 我试过的方法奏效了。

C# 方法的参数按值传递而不是按引用传递,因此在函数内部对它们的更改是函数局部的。如果你想更新这些值,那么你可以在它们前面加上 ref 关键字。

void AddExp (ref int skill, ref int skillExp, int expAmount)

备用解决方案 或者,您可以通过使用 class 封装您的技能概念来简化您的设计。有一种可能,我不太了解你的数学,也不熟悉你的其他 classes,因此你可以根据需要进行调整。

   public class Skill
   {
      private string _name;
      private int _currentValue;
      private int _currentLevel = 1;

      public Skill(string name) {
      }

      public string Name { get { return _name; } }

      public int CurrentXp { get { return _currentValue; } }
      public int CurrentLevel { get { return _currentLevel; } } 
      public int XpRequiredForNextLevel { get { return Xp.LevelToXP(_currentLevel + 1); } }
      public int XpRequiredForCurrentLevel { get { return Xp.LevelToXP(_currentLevel); } }

      private float CalculateFillPercentage(int xp)
      {
         var xpInLevel = XpRequiredForNextLevel - XpRequiredForCurrentLevel;
         return (float)(xp - XpRequiredForCurrentLevel) / (float)xpInLevel;
      }

      public void AddXp(int expAmount) 
      {
         _currentValue += expAmount;
         int XpInCurrentLevel = XpRequiredForNextLevel - XpRequiredForCurrentLevel;
         if (_currentValue > XpRequiredForNextLevel) {
         } else {
            _currentLevel++;
         }
         XpBar.fillAmount = CalculateFillPercentage (_currentValue);        
      }
   }

您可以通过持有每个技能的实例来使用它,例如:

Skill combat = new Skill("combat");

然后稍后

combat.AddXp(50);

每项技能都是独立的。我不确定 XpBar 或它如何在不同类型的技能之间进行控制,但您可以通过内部计算进一步封装,因此该技能提供了您 UI 需要保持最新状态的一切。