属性概念
在C#中,属性是类、结构和接口的成员。它们提供灵活的机制来读取、编写或计算私有字段的值。属性可以被看作是对字段访问的封装,允许你定义获取(get)和设置(set)这些字段值的方法,而无需直接暴露字段本身。在Unity中主要是为了封装和保护字段。
属性在Unity中的使用
假设我们有一个玩家血量脚本
using UnityEngine;
public class PlayerHealth : MonoBehaviour
{
public int health = 100;
public int Health
{
get { return health; }
set
{
health = Mathf.Clamp(value, 0, 100); // 确保health在0到100之间
if (health <= 0)
{
Die(); // 当健康值小于等于0时调用Die方法
}
}
}
}
肯定要有一个血量的字段,我们可以再给血量加一个属性,这个Health属性包含get和set访问器,分别对应“读”和“写”操作。
PlayerHealth playerHealth=new PlayerHealth();
playerHealth.Health=50;//给玩家血量设为50,对应它的set访问器
//通过get访问器,来读取玩家血量
if(playerHealth.Health<10){
print(“玩家进入低血量状态”)
}
//直接“点”字段
PlayerHealth playerHealth=new PlayerHealth();
playerHealth.health=50;//直接将health这个字段设为50
//如果不通过属性
playerHealth.health=200;
//这样给health这个字段赋值为200,但显然这是不符合我们预期的,因为我们规定要将玩家血量范围为0-100
可以看到,属性和字段有点相似,他们都是通过“点的方式”来访问,跟字段不同的是,这个属性相当是把字段封装起来了,并且给这个玩家血量字段加了一些简单的规则。
属性里的get和set
正如我举的玩家血量这个例子,我通过属性将玩家血量这个字段封装起来,并加了一些简单的逻辑,规定玩家血量范围和判断玩家死亡。这里提到要“简单逻辑”,不要在get和set里写太复杂的逻辑。如果是太复杂的逻辑,我们应该另外写一个专门的方法。所以说get和set就有点类似方法的作用,get就是读取方法,set即写入方法。
说到方法,也可以在get和set前加访问修饰符。此外我们灵活的写get和set,比如只有get
public int Health{
get{
return health;
}
}
这样就是只读属性,而不能修改玩家血量的值
714

被折叠的 条评论
为什么被折叠?



