数据存储的选择:尽量不要用多个字段存储多个格子,也不要用字符串,存储空间会变大。结论是使用二进制数据存储。
- 背包系统结构
关于背包 客户端与服务器端需要传输的结构,
//协议
message NBagInfo{
int32 Unlocked = 1; --解锁到第几个格子
bytes Items = 2; --背包里面有多少道具
}
message BagSaveRequest
{
NBagInfo BagInfo = 1;
}
message BagSaveResponse
{
RESULT result = 1;
string errormsg = 2;
}
利用unlock参数来决定Items长度。
服务器端:
创建背包相关表CharacterBag,
表结构为:
ID | int32
Items | Binary
Unlocked | Int
创建与Charater表的关联,关联关系为1比1,一个角色只能有一个背包。(多个背包页如何管理?)
在Character类初始化背包。
OnGameEnter→AddCharacter→Character→初始化背包。
this.Info.Bag = new NBagInfo();
this.Info.Bag.Items = this.Data.Bag.Items;
this.Info.Bag.Unlocked = this.Data.Bag.Unlocked;
创建背包接收监听,
public class BagService : Singleton<BagService>
{
public BagService (){
MessageDistributer<NetConnection<NetSession>>.Instance.Subscribe<BagSaveRequest>(this.OnBagSave);
}
public void Init() {
}
void OnBagSave(NetConnection<NetSession> sender, BagSaveRequest request) {
Character character = sender.Session.Character;
Log.InfoFormat("BagSaveRequest:character:{0},Unlocked{1}", character.Id, request.BagInfo.Unlocked) ;
if (request.BagInfo != null) {
character.Data.Bag.Items = request.BagInfo.Items;
DBService.Instance.Save();
}
}
在用户创建角色时给角色增加背包,在UserService→OnCreateCharacter 背包初始化。
var bag = new TCharacterBag();
bag.Owner = character;
bag.Items = new byte[0];
bag.Unlocked = 20; //解锁20个格子
character.Bag = DBService.Instance.Entities.CharacterBags.Add(bag);
客户端:
给客户端的物品Item的Model类增加配置表类ItemDefine,一旦产生新道具,就把配置赋予他,以便随时能得到新增加的道具的定义。
-
#Item类
public class Item { public int Id; public int Count; public ItemDefine define; public Item(NItemInfo item) { this.Id = item.Id; this.Count = item.Count; this.define = DataManager.Instance.Items[item.Id]; } }
之后设计BagItem的Model类,思考要如何设计比较好?
-
~~关于BagItem思考
考虑到背包有格子这种东西,我本来思索应该会用字典来存储Item,然后Key值为格子的位置,然后应该会用事件来加载人物所持有的数据,在