衣服有新有旧,但只要是衣服,就是用来穿的;一捆鱼有多有少,但只要是鱼,就是用来吃的——当然,有的时候也可以冻起来当做武器使用。同一种物品有同一种物品的共性,不同物品有不同物品的特性。这里我们以罗非鱼这一物品为例:
一个物品有许多共有的属性,比如名称、物品代号、基础价格、耐久度等;根据用途的不同,也有许多不同的属性,例如作为罗非鱼,它应当有食物和武器属性:
物品名称:罗非鱼
物品类型:食物/武器/资源
基础价格: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>