使用场景:
制作一个RPG游戏,里面设定了大量的属性,然后其他的一些事件当中需要对这些属性进行加减乘除,最初使用swich函数来做,每个函数都写一次方法,过于麻烦,因此寻找了新方法来替换
人物属性代码:
public class Player : MonoBehaviour
{
public int 攻击 { get; set; }
public int 防御 { get; set; }
public int 生命 { get; set; }
public static Player instance;
private void Awake()
{
instance = this;
}
{
这个部分是我设定的人物属性,这里就简单点,攻防血三个(实际上应该会有几十个属性)
调用修改代码:
public void Method(string propertyName, int newValue)
{
//获取对应的属性(获得这个类,然后获得类当中的属性)
PropertyInfo propertyInfo = Player.instance.GetType().GetProperty(propertyName);
if (propertyInfo != null && propertyInfo.CanWrite)
{
//声明一个新属性,访问原来的只读属性
System.Type propertyType = propertyInfo.PropertyType;
object originalValue = propertyInfo.GetValue(Player.instance);
//获得原有值
object convertedOriginalValue = System.Convert.ChangeType(originalValue, propertyType);
//获得增加值
object convertedNewValue = System.Convert.ChangeType(newValue, propertyType);
//设定改变值
object resultValue = System.Convert.ChangeType((int)convertedOriginalValue + (int)convertedNewValue, propertyType);
//赋值
propertyInfo.SetValue(Player.instance, resultValue);
}
}
这个是我在另外一个类里面设定的方法,通过单例模式来访问,可以使用字符名去更改对应的属性值
注意事项:
- 需要使用using System.Reflection这个命名空间
- 需要区分属性和字段的分别,这两个在Unity中我之前几乎不区分它们,但是了解了相关资料后,发现一个安全性问题(可不可以被访问修改)导致他们有了区别,因此在使用属性方法的时候,需要注意这个方法,否则会获取不到属性
- 其他文章当中的Type我并找不到,但是如果加了System.Type就可以使用了,包括System.Convert也是如此
23年9月4日补充
后来再看了看教程,发现访问字段也可以,字段相对来说,更便捷
方法如下:
public void GetResoures(string 资源名,int 数目)
{
Type type = PlayerData.instance.GetType();//获得类型
FieldInfo feldInfo1 = typeof(PlayerData).GetField(资源名);//获得字段名
int i = int.Parse(feldInfo1.GetValue(PlayerData.instance).ToString())+数目;//访问字段的值,并加上新数目
feldInfo1.SetValue(PlayerData.instance, i); //进行设置
}
这里的PlayData是我的游戏物体数据,这个方法也需要用到反射:using System.Reflection;
所以感觉做游戏,技术是学不完的,但是不学也不行哈哈