我对用C#编程相当陌生,正在努力自学更多. 我一直在try 用RPG等级的属性来制作一个简单的RPG,但在试图根据我的角色属性对敌人施加伤害时遇到了麻烦.

当我认为我已经解决了这个问题,把玩家的统计脚本分成了敌人单位的第二个统计脚本时,我不幸地遇到了这个问题,任务的左侧需要是一个变量属性或索引器,无论我如何寻找解决方案,我都会被难住.有没有人能看一眼我的 playbook ,指出我犯了什么明显的错误?

请多多关照!

   public void TakePhysicalDamage()
    {
    defaultStats.GetPhysicalDamage()-= armor; //This is the offending line
    physicalDamage = Mathf.Clamp(physicalDamage, 0, int.MaxValue);
    health -= (int)Math.Round(physicalDamage);   
    
    if(health <= 0)
        {
        health = 0;
        Die();
    }
}
void Die()
{
    {
        playerLevel.AddExperience(experience_reward);
    }
    Destroy(gameObject);
}

}

以下是playerstats(Defaultstats)脚本,仅供参考,我试图从中获取物理伤害

[序列化字段]浮动强度=5f; [序列化字段]浮动物理损坏=5f;

  public float GetPhysicalDamage()
  {
    return physicalDamage += strength;
  }

很抱歉,如果这看起来太基本了,但如果你觉得无聊,请看一下!

推荐答案

您正在try 修改函数:

defaultStats.GetPhysicalDamage()-= armor;

但你不能,因为GetPhysicalDamage只返回伤害,它没有设置为允许你修改它的属性(也不要这样做!)

public float GetPhysicalDamage()
{
  return physicalDamage += strength;
}

相反,看起来您应该使用变量physicalDamage,如下所示:

public void TakePhysicalDamage()
{
    physicalDamage = defaultStats.GetPhysicalDamage() - armor; //This is the offending line
    physicalDamage = Mathf.Clamp(physicalDamage, 0, int.MaxValue);
    health -= (int)Math.Round(physicalDamage);   
    
    if(health <= 0)
    {
        health = 0;
        Die();
    }
}

事实上,仔细想想,我认为你可能没有做你认为你正在做的事情.看起来physicalDamage应该是你造成的基本伤害,但当你有一行来自GetPhysicalDamage()的话:

return physicalDamage += strength;

如果physicalDamage是5,strength是5,那么当你第一次调用GetPhysicalDamage()时,你得到的是10.但你所做的是adding物理伤害的强度,storing+=运算符的新物理伤害,这样下一次你调用GetPhysicalDamage()时,physicalDamage变量现在是10(来自上一次调用),现在它返回15.然后是20,25,等等.

我认为你想要的只是身体伤害和力量的总和,就像:

return physicalDamage + strength;

但如果是这样的话,我认为变量名physicalDamage具有误导性.我个人更喜欢basePhysicalDamage这样的东西,然后你就可以拥有这样的房产:

public int PhysicalDamage => basePhysicalDamage + strength;

我特别建议您这样做,因为在代码的后面部分,您现在遇到了问题,您正在修改如下代码行中的physicalDamage变量:

physicalDamage = Mathf.Clamp(physicalDamage, 0, int.MaxValue);

这也是令人困惑的,因为它看起来像是你试图用armor修改GetPhysicalDamage,但当你呼叫GetPhysicalDamagearmor时,你得到的是相同的(本地)来源,所以这可能是玩家用玩家的盔甲对自己造成的身体伤害,或者是暴徒用他们的盔甲对自己造成的身体伤害.

我会把损害作为一个论点来传递,这样你就可以把损害从一件事传递到另一件事上,比如:

public void TakePhysicalDamage(int damage)
{
    damage -= armor;
    damage = Mathf.Clamp(damage, 0, int.MaxValue);
    health -= (int)Math.Round(damage);
    if(health <= 0)
    {
        health = 0;
        Die();
    }
}

Csharp相关问答推荐

注册通用工厂的C# Dep注入

哪个nuget包含SecurityStampValidatorOptions

为什么EF Core 6会针对null验证Count(*)?

有没有办法使.NET 6应用程序在特定的.NET 6运行时版本上运行

注册所有IMediatR类

如何使用XmlSerializer序列化带有CDATA节的XML文件?

我如何让我的秒表保持运行场景而不重置

为什么C#认为这个非托管 struct 有一个重叠

C#带主体的主构造函数?

如何让NLog停止写入冗余信息?

TagHelpers在新区域不起作用

GODOT 4向C#中的字符串参数发送信号以等待

如何更改新创建的实例的变量?

如何实现有条件的自定义Json转换器隐藏属性

如何在同一成员上组合[JsonPropertyName]和[ObservableProperty]?

使DefaultIfEmpty返回空

Cmd中的&ping.end()";有时会失败,而";ping";总是有效

在.Net 8 Visual Studio 2022中启用本机AOT发布时发布失败

使用Try-Catch-Finally为API端点处理代码--有什么缺点?

C#LINQ多行条件