RPG 游戏数值系统—2

来源:互联网 发布:紫川软件 编辑:程序博客网 时间:2024/05/17 21:59

   接着前面所讲的RPG数值系统,前面讲到怎么添加一些基本属性然后怎么通过可视化的方法给每个人物进行配置他们所有属性,接下来就是怎么知道我的属性它的值是多少,例如当角色进入攻击状态的时候我们需要知道角色的攻击力,暴击概率,攻击速度,及暴击倍数,同时当角色进入被攻击状态的时候,如果角色受到的是魔法伤害我们需要知道角色的魔法抗性是多少,当敌军是物理攻击的时候,我们需要知道角色的护甲是多少。最后计算出消耗多少血量,还有我们买了一把攻击力比较高的长剑或者买了一本魔法强度比较高的法典时,这些都会对我们原有的攻击力或者法术强度进行修改,当我们取值的时候插件会提供给我们方法。

            var t = rpgStatCollection.GetStat<RPGStatModifiable>(RPGStatType.Armor);            Debug.LogError(t.StatValue);            var t1 = rpgStatCollection.GetStat<RPGVital>(RPGStatType.Armor);            Debug.LogError(t1.StatValue);            Debug.LogError(t1.StatValueCurrent);                                    var t2 = rpgStatCollection.GetStat<RPGAttribute>(RPGStatType.Armor);            Debug.LogError(t2.StatValue);            var t3 = rpgStatCollection.GetStat<RPGStat>(RPGStatType.Armor);            Debug.LogError(t3.StatValue);
当属性的类型是RPGStatModifiable,RPGAttribute,RPGStat的时候我们只能拿到他得StatValue的值,当为RPGVital的时候我们可以拿到StatValueCurrent的值,这个值是有set方法的而所有的StatValue的值只有get方法,所以如果需要对StatValue值进行改变就需要通过其他的方法了。方法如下:

            var t = rpgStatCollection.GetStat<RPGStatModifiable>(RPGStatType.Armor);            Debug.LogError(t.StatValue);            t.AddModifier(new RPGStatModBaseAdd(100));            t.UpdateModifiers();
改变当前属性的值有几种方法,主要有RPGStatModBaseAdd,RPGStatModTotalAdd,RPGStatModBasePercent,RPGStatModTotalPercent这些,他们分别的意思是对基本值进行添加,计算完了之后的值进行加减,后面2个和前面2个意思基本保持一致,只不过后面是百分数而已,知道了怎么拿到属性的值还有怎么修改属性的值之后这个插件就基本没什么好讲的了,不过还存在一些小小的问题就是,假如角色买了一把无尽之刃,它既添加攻击力有增加暴击伤害,它同时对2个或者以上的属性的值就行了修改,所以我们把修改属性的值的这种东西称作一个Modifieritem,这个Modifieritem包含了对多个属性值得改变,所有他这里存在一个list然后每个list里面的单个list[i]包含对那个一个type值(这个值是一个枚举值,它可能是护甲,或者魔抗等等),同时也包含是那个具体的修改器是上面四种修改器的某一种。所以我们需要对RPGStatCollection写他的扩展方法。同样我们还存在一个问题就是当我们卖掉这个装备的时候,我们需要移除一些修改器,同样假如我们买了一些小的装备然后把这些小的装备合成一个大的装备的时候我们需要把这些小的装备的修改器移除掉同时又需要添加这个大的装备的修改器,所以扩展类的作用就完成这些作用,代码就直接贴出来 比较简单。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using StatSystem;public static class RpgCollectionExt{    public static Dictionary<int, RpgClollectionItem> ModifierDictionary;     private static void AddStatModifier(this RPGStatCollection rpgStatCollection, RPGStatType rpgStatType,        RPGStatModifier rpgStatModifier)    {        rpgStatCollection.AddStatModifier((int)(rpgStatType), rpgStatModifier);    }    public static void AddCollectionItem(this RPGStatCollection rpgStatCollection, RpgClollectionItem modifier)    {        if (ModifierDictionary == null)        {            ModifierDictionary = new Dictionary<int, RpgClollectionItem>();        }        if (ModifierDictionary.ContainsKey(modifier.Id))        {            var modifieroitem = ModifierDictionary[modifier.Id];            for (int i = 0; i < modifieroitem.Items.Count; i++)            {                var item = modifieroitem.Items[i];                rpgStatCollection.RemoveStatModifier((int)item.RpgStatType, item.RpgStatModifier);            }            ModifierDictionary.Remove(modifier.Id);        }        for (int i = 0; i < modifier.Items.Count; i++)        {            var item = modifier.Items[i];            rpgStatCollection.AddStatModifier(item.RpgStatType, item.RpgStatModifier);            rpgStatCollection.UpdateStatModifer(item.RpgStatType);        }        ModifierDictionary.Add(modifier.Id, modifier);           }}
里面有一个添加的方法同时肯定差一个移除的方法,所以这里如果有需要自行添加移除方法了。下面给出插件项目文件这个文件中包含了一些跟插件无关的东西,如果有需要大家自己把无关的移除就行了。如果有需要可以后面讲一个完整的RPG游戏(包含ui,主游戏逻辑和SDK等),项目地址:https://pan.baidu.com/s/1dEUOdUD,如果有需要可以联系本人,qq:1850761495