C# 统一RPG,正确施法,不使用法力,但伤害仍然持续

C# 统一RPG,正确施法,不使用法力,但伤害仍然持续,c#,unity3d,C#,Unity3d,我创造了一种既能使用法力又能对敌人造成伤害的技能。我成功地做到了,如果我的玩家的法力=成本){ //移除用于该法术的法力 currentMP-=成本; //玩家可以施法 返回true; } //给用户的消息,因为他的施法失败 Log(“施法失败”); //玩家无法施法 返回false; } 我们现在可以使用这些返回值从枚举中返回 IEnumerator Skill1Use() { 如果(!playerUnit.UseMana(10)){ //从枚举数中返回 屈服断裂; } ..... } 如

我创造了一种既能使用法力又能对敌人造成伤害的技能。我成功地做到了,如果我的玩家的法力<技能成本,那么它将不会使用任何法力。问题是,即使它不会使用法力,技能仍然会被使用,伤害也会被消除

单位.cs

public void UseMana(int spellcost)
{
    if (currentMP >= spellcost)
    {
        currentMP -= spellcost;
    }
}
IEnumerator Skill1Use()
{
    playerUnit.UseMana(10);

    
    playerHUD.SetMP(playerUnit.currentMP);

     

    bool isDead = enemyUnit.TakeDamage(Convert.ToInt32(playerUnit.damage * 1.2));

    
    enemyHUD.SetHP(enemyUnit.currentHP);
    dialogueText.text = "The attack is successful";
    yield return new WaitForSeconds(2f);

    if (isDead)
    {
        state = BattleState.WON;
        EndBattle();
    }
    else
    {
        state = BattleState.ENEMYTURN;
        StartCoroutine(EnemyTurn());
    }
作战系统.cs

public void UseMana(int spellcost)
{
    if (currentMP >= spellcost)
    {
        currentMP -= spellcost;
    }
}
IEnumerator Skill1Use()
{
    playerUnit.UseMana(10);

    
    playerHUD.SetMP(playerUnit.currentMP);

     

    bool isDead = enemyUnit.TakeDamage(Convert.ToInt32(playerUnit.damage * 1.2));

    
    enemyHUD.SetHP(enemyUnit.currentHP);
    dialogueText.text = "The attack is successful";
    yield return new WaitForSeconds(2f);

    if (isDead)
    {
        state = BattleState.WON;
        EndBattle();
    }
    else
    {
        state = BattleState.ENEMYTURN;
        StartCoroutine(EnemyTurn());
    }

如果成功,您可以返回一个
bool
,作为检查:

public bool UseMana(int spellcost)
{
    if (currentMP >= spellcost)
    {
        currentMP -= spellcost;
        return true;
    }

    return false;
}
然后呢

IEnumerator Skill1Use()
{
    // if the mana was not successful break here and do nothing
    if(!playerUnit.UseMana(10))
    {
        dialogueText.text = "Not enough Mana for the attack! :(";
        yield break;
    }

    ...
问题是,即使它不会使用法力,技能仍然是 使用后,损坏会消失

目前你没有检查用户是否有足够的法力来施法。实现这一点的最简单方法是让UseMana函数返回bool,然后使用它退出Skill1Use枚举

如果您想在施法失败时显示消息,可以将其放入UseMana功能

更改了UseMana功能:

public bool UseMana(整数拼写成本)
{
如果(当前MP>=成本){
//移除用于该法术的法力
currentMP-=成本;
//玩家可以施法
返回true;
}
//给用户的消息,因为他的施法失败
Log(“施法失败”);
//玩家无法施法
返回false;
}
我们现在可以使用这些返回值从枚举中返回

IEnumerator Skill1Use()
{
如果(!playerUnit.UseMana(10)){
//从枚举数中返回
屈服断裂;
}
.....
}
如果您不想使用
产生中断跳过整个枚举数当玩家无法施法时,你可以切换if语句,并将所有依赖于施法的代码包含到if语句中

仅跳过枚举器代码的某些部分:

IEnumerator Skill1Use()
{
如果(playerUnit.UseMana(10)){
//玩家执行了咒语,所以我们现在可以开始计算了
.....
}
//玩家无法施法,因此我们可以跳过伤害计算,
//死亡检查和设置UI
否则{
.....
}
.....
}

产生返回空值错误(请参阅)<代码>收益返回空仅延迟一帧,但继续执行例程。。要退出
IEnumerator
,您必须使用
产量中断谢谢,我不知道如何再次退出枚举。因此,是的,基本上现在我们说的是完全相同的;)谢谢大家!令人惊讶的是,这里的人们反应如此之快。它现在起作用了,如果没有足够的法力点击按钮,什么都不会做。现在,如果我想显示一条文字,说“没有足够的法力”,我应该把它放在代码中的什么地方。@mookalious我相应地编辑了我的答案,如果你真的想向用户显示它,而不只是在控制台上打印一条消息,你可能需要启用一个面板gui来模拟弹出窗口。