Unity物品系统设计与实现——1.物品信息

  衣服有新有旧,但只要是衣服,就是用来穿的;一捆鱼有多有少,但只要是鱼,就是用来吃的——当然,有的时候也可以冻起来当做武器使用。同一种物品有同一种物品的共性,不同物品有不同物品的特性。这里我们以罗非鱼这一物品为例:

  一个物品有许多共有的属性,比如名称、物品代号、基础价格、耐久度等;根据用途的不同,也有许多不同的属性,例如作为罗非鱼,它应当有食物和武器属性:

物品名称:罗非鱼

物品类型:食物/武器/资源

基础价格:100

耐久度上限:200

堆叠上限;

图标:不同数量的图标

模型;不同品质的覆盖模型;

食物/消耗品属性

        饥饿度回复:10

        使用时的动作模组:吃

        食用效果:寒冰抗性

武器属性:

        伤害:10砍5钝5冰

        武器类型:剑

        命中附加效果:

               10%冻伤;10%流血;

  这是同一种物品应当拥有的公共属性。对于不同的项目来说这些属性可能过于繁杂或者比较缺乏,这些都由项目的具体性质来确定;这些数据如何应用到一个具体的玩家或npc角色上,这是其他部分要关注的内容,我们这里只关注如何存储和管理这些信息。为了实现它,我们需要建立一个用于存储这些信息的类(ItemDef),它的结构如下:

用简易的代码实现:

public class ItemDef
{
    //通用属性
    public string itemName;
    public int itemID;
    public spirte itemIcon;
    public GameObject itemModel
    //用途属性
    public FoodState foodState;//作为食物时的属性,如果为null,代表该物品不可作为食物
    public WeaponState weaponState;
    ....
    public ItemDef(XMLNode xml)//从配置文件中读取物品定义
    {
        ....
    }
}
public enum ItemClass//物品种类的枚举,其实这里使用枚举时,可扩展性受限,即添加新物品类型时受限
{
    food,
    weapon,
    ......
}
public class ItemState//所有不同用途信息的父类
{
    
}

public class FoodState:ItemState
{
    public int FreshnessDecreasement;//腐烂速度
    public int nutrition;//营养
    public effect[] eatenEffect;//食用后获得的buff
}
public class WeaponState:ItemState
{
    ......
}

我们可以在一个静态类或者一个通用的monobehavior对象中存储这些对象,例如

public static class GameState
{
    public static GameDirector gameDirector;
    public static ItemDef[] ItemDefList;//静态类只负责存储
}

在游戏导演类中(gameDirector)初始化数据,或加载存储在xml/json中的信息

public class GameDirector : Monobehavior
{
    string path;//配置文件的位置;
    void Awake()
    {
        gameState.AllItemDefs = ReadFromXML(path);
    }
    void ReadFromXML(string XMLPath)
    {
        ......
    }
}

一个xml文件结构的示例:

<ItemDef>
    <Item>
        <Name>FrozenFish</Name>
        <ItemClass>Food</ItemClass>
        <IconPath>......</IconPath>
        <ModelPath>......</ModelPath>
        <FoodState>
            <nut>1</nut>
            <freshnessDec>1.5</freshnessDec>
            <effect>
                ....
            <effect>
        </FoodState>
        <WeaponState>
            <WeaponKind>Sword</WeaponKind>
            <Damage>10,5,0,0,5,0</Damage>
            <hitEffect>
                ......
            </hitEffect>
        </WeaponState>
    </Item>
    //    另一个物品
    <Item>
        <Name>WoodSheild</Name>
        ......
    </Item>
    ......
</ItemDef>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值