您混淆了"field" 和"property" 这两个术语。属性可以在 getter 和 setter 中实现额外的行为。
首先:Unity 做not serialize properties!
这将 Unity 中属性的用途限制在运行时。
所以大部分时间都会想要像这样的模式
[SerializeField] private int a;
public int A => a;
这个例如目的是您可以通过编辑器分配一个值,由类本身编辑它,但只允许其他人只读访问 => 封装。
当然,为了完整性,它可以执行额外的完整性检查,例如
private const int min = -3;
private const int max = 17;
private bool allowSet;
[SerializeField] private int a;
public int A
{
get => a;
set
{
if(allowSet) a = Mathf.Clamp(a, min, max);
}
}
几乎不需要自动属性(在我看来)除了您想直接限制访问,例如
public int b { get; private set;}
这只允许这个类写,但其他人读这个值
所以什么时候有用主要是主观的,取决于具体情况。
现在查看您的代码,Speed - speed 和 FireRate-fireRate 之间绝对没有关系!它们是完全独立的字段和属性。
这里的混淆可能是由于 Inspector 创建的显示名称。它会自动将所有字段名称大写,所以
[SerializeField] private int _example;
将显示为Example。
你很可能会选择
[SerializeField] protected float Speed;
[SerializeField] protected float FireRate;