2 回答
TA贡献1858条经验 获得超8个赞
由于您的用例实际上是在每次设置值时执行特定行为,因此我建议最好使用Properties。有两种选择,具体取决于您的需要一些示例
// Auto property which doesn't have any behavior
// read and write able
public string charName { get; set; }
// read only property
public int currentHP { get; private set; }
// read only property with a backing field
private int _maxHP = 100;
public int maxHP
{
get { return _maxHP; }
}
// same as before but as expression body
private int _strength;
public int strength { get => _strength; }
// finally a property with additional behaviour
// e.g. for the setter make sure the value is never negative
private int _defense;
public int defense
{
get { return _defense; }
set { _defense = Mathf.Max(0, value); }
}
正如您所看到的,属性在某种程度上取代了 getter 和 setter 方法,在某些情况下甚至充当字段的角色(自动属性)。在 getter 和 setter 中,您都可以实现其他行为。一旦你这样做了,你就必须使用支持字段。
例如,您可以像字段一样使用和访问它们
someInstance.defense += 40;
执行两者,首先执行 getter 以便了解 的当前值_defense,然后添加40并使用 setter 将结果写回到_defense。
作为替代方案并且更接近您原来的方法是如上所述的Dictionary。我会把它与适当的结合起来,enum例如
public enum ValueType
{
MaxHP,
Strength,
Defense,
CurrentHP
}
private Dictionary<ValueType, int> Values = new Dictionary<Value, int>
{
{ValueType.MaxHP, 100},
{ValueType.Strength, 0 },
{ValueType.Defense, 0 },
{ValueType.CurrentHP, 0 }
};
public void ChangeValue(ValueType valueType, int value)
{
Values[valueType] += value;
// do additional stuff
}
将该方法要控制的值添加到enum和 的开销最小Dictionary。
TA贡献1784条经验 获得超7个赞
如果变量是公共的,您可以直接更改另一个脚本中的变量值。
假设你有一个玩家对象:
class Player : MonoBehaviour {
public int currentHP;
public int maxHP = 100;
}
您可以从另一个类访问这些值,如下所示
class Enemy : MonoBehaviour {
public Player player;
void Start() {
player.currentHP -= 10;
}
}
您只需player在 Unity 编辑器中将其拖放到(在本例中)Enemy脚本上即可进行分配。
- 2 回答
- 0 关注
- 142 浏览
添加回答
举报