Unity当中通过字符名修改对应属性

使用场景:
制作一个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;
所以感觉做游戏,技术是学不完的,但是不学也不行哈哈

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值