标题: Entity跨进程转移,InstanceId变化以及反序列化相关讨论
Entity从一个Map进程传送到另一个Map进程, 反序列化会调用无参构造函数, Component中的构造函数会重新设置InstanceId. ( 包含了所在服务器信息 ),
————————————————————–
【码神】Ray
InstanceId是BsonIgnore的.反序列化的时候构造函数重新生成新的InstanceId..不得不说妙啊
【码仙】ks
反序列化出来的,要手动加入EventSystem
【码神】Ray
M2M_TrasferUnitRequestHandler里有在新map里反序列化unit的示例.不过应该不能正常工作…unit反序列化后.之前挂载的component也没有了.demo里只加了MailBoxComponent.移动之类的component都没加
【码神】Ray
想要反序列化出来的正常使用.应该将所有AddComponent的操作放到AwakeSystem或者StartSystem中..这样添加到eventsystem的时候就可以自动添加需要的组件了..
【群主】熊猫 2019/3/29 14:16:59
组件可以设置是否可以跟随序列化,不能跟随序列化的需要在反序列化后手动添加
【码神】Raywrylray@qq.com 14:23:24

@熊猫 这里是Entity是反序列化的时候的EndInit..这些component跟着反序列化过来.并没有加入到eventsystem中去吧..这里的操作只是初始化了componentDict
【码神】Raywrylray@qq.com 14:24:19
如果是start.awake还好.初始化操作在之前已经执行过了.如果是updatesystem.这里应该就有问题了
【群主】熊猫(80081771) 14:25:05
看看iserializertoentity接口,组件继承这个接口就能跟随序列化
【码神】Raywrylray@qq.com 14:28:51
嗯..我看到了..可是..跟随entity的组件..没有这一步加入到eventsystem中
【码神】Raywrylray@qq.com 14:30:29
也就是说.需要根据这个组件有没有updatesystem来决定是否让他可以ISerializeToEntity吗..
【码神】Raywrylray@qq.com 14:31:24
人工判断一下..简单的数据组件直接跟着entity走.复杂的.传送过来后.重新添加.比如写在M2M_TrasferUnitRequestHandler里..
【码神】有招小弟的大佬吗?(385189207) 14:33:16
为啥updateSystem会有问题…
【码神】Raywrylray@qq.com 14:41:39
@有招小弟的大佬吗? 比如传送unit.传过来的unit下面带若干个继承了ISerializeToEntity的component.这些component会随着Entity反序列化时创建,但是不会加入新地图进程的EventSystem.
所以这些component的所有System都不会在创建后触发.
【码神】Raywrylray@qq.com 14:33:31
@熊猫 大概理解了.UnitGateComponent就是跟着Entity走的
【群主】熊猫(80081771) 14:33:36
@Ray 不能自动加,自动加入那么对象需要保存到数据库会序列化到dbserver,这样会导致dbserver上注册了updatesystem,实际上是不需要的
【群主】熊猫(80081771) 14:35:37
@Ray 有个办法就是在deserializersystem中判断是否是mapServer,是的话注册到eventsystem中去
【码神】Raywrylray@qq.com 14:37:30
靠谱..不过需要非常清晰的了解框架..
【码神】Raywrylray@qq.com 14:42:58
不过ISerializeToEntity是手动继承的..所以选择继承ISerializeToEntity的时候就要想好了
【码神】Raywrylray@qq.com 14:44:41
最不会出错的方式!就是都不继承ISerializeToEntity.然后传送后一个个添加组件..
【码神】Raywrylray@qq.com 14:44:54
高端方式就是熊猫说的在deserializersystem里再判断
【群主】熊猫(80081771) 14:47:05
@Ray 这样就太麻烦了,比如背包组件,这种跟随序列化是非常必要的
【群主】熊猫
服务端玩家身上要处理updatesystem的情况是非常少的
【码神】wap.19980528@qq.com 2019/3/29 14:47:59
服务器不敢用update
【码神】Ray 2019/3/29 14:49:21
嗯..说的是
————————————————————–
【码仙】小木(29858488) 21:20:50
现在又要弄数据库了。我今天试了试,存一个实体。且这个实体,我特意给它加了一个组件。然后只存这个实体,然后看数据库。这个实体下的组件一个都没有。我想问问,有什么办法能直接存一个实体会连带存挂在它身上的组件?没办法的话,就只能分开存了啊
【码神】有招小弟的大佬吗?(385189207) 21:34:41
就是你要序列化的那个组件 继承ISerializeToEntity
【码仙】乱我心者 不可留(1043360492) 21:44:10
实体带数据序列化直接存库吗
【码神】Raywrylray@qq.com 21:45:22
可以不存啊.直接发消息也行.想存也能村
【码神】Raywrylray@qq.com 21:46:55
存的时候把和进程绑定的信息都干掉..熊猫已经默认做好了.比如instanceid就不会存..但是自己定义的就得注意了
【群主】熊猫(80081771) 21:49:07
mongo搭配树状组件真的天衣无缝啊
【码神】大广(2480886393) 21:49:30
嗯,这倒是。
【群主】熊猫(80081771) 21:50:21
有些组件太庞大比如背包组件可以单独存一张表,其它小的组件的可以跟随玩家实体存
【码仙】初见(362946) 21:52:47
那这样说,任务也需要单独一个表了
【码圣】ChowJayYe(25348838) 21:53:31
一般是按功能分吧。。。我记得。
【码神】ET小迷弟AE(210379417) 21:53:34
任务才几个啊
【码神】ET小迷弟AE(210379417) 21:53:43
一般也就最多允许玩家接10个,20个任务了
【码圣】ChowJayYe(25348838) 21:53:43
大功能。
【码神】Raywrylray@qq.com 21:53:53
我倒是觉得能分则分..合容易拆难
【码圣】ChowJayYe(25348838) 21:54:06
一组数据,对应一个大功能
【群主】熊猫(80081771) 21:54:13
任务也可以单独存,任务组件继承ComponentWithId,id设置成跟playerid,这样很好查的
【码仙】慢慢再(506982926) 21:55:05
相当于同一个组件插成几个。
【码仙】初见(362946) 21:56:27
我现在任务是挂在角色上存的。我得考虑下是不是要拆出来
【码仙】ks(1227114700) 21:55:10
牛逼了
【码仙】ks(1227114700) 21:55:22
我都没想到componentWithId能这样用
【群主】熊猫(80081771) 21:56:38
没id组件不能存数据库啊,显然单独存的要继承ComponentWithId
【群主】熊猫(80081771) 21:57:29
在awake中把id设置成实体的id
【码仙】慢慢再(506982926) 21:58:15
背包信息 很多模块要用到。 不放也要取了挂载吧
【码仙】初见(362946) 21:58:51
也就第一次登陆需要数据库拉下数据,后面的都不需要数据库了。
【码仙】ks(1227114700) 21:58:52
学到了,感谢猫大
【码仙】初见(362946) 21:59:20
我感觉背包大点放人物身上,也没什么问题的。
【群主】熊猫(80081771) 22:00:02
这是ET的精髓啊
————————————————————–
【码仙】初见
EndInit方法大家使用的时候注意下,这个方法是序列化后调用的。但有一个问题,比如你MAP想在序列化后把数据处理下,有可能会调动一些组件这样的操作。
【码仙】初见
看起来是没有问题,但这个保存会发送到DB服务器,DB服务器也会序列化,就会调用这个EndInit,当DB服务器没有你EndInit里的一些组件,那就GG了
【码仙】初见
我是在里面加了判定服务器搞定的
【码仙】初见
这个是很正常的操作
【码仙】初见 2019/4/9 10:16:08
自己用的时候,加个服务器判定就好了