比如Root下有A,B两个组件,我想Client下包含AB两个,Server下只包含A。怎么做?
除非B是显示相关,放到ModelView中,不然Server怎么做B组件的机器人?
egametang B确实是放在ModelView中了,理论上如果单开服务器是不会序列化出B的。就是现在在Unity下,服务器端却把B也序列化出来了。另外B确实就是显示相关的。我做技能编辑器,把逻辑和表现分离,想着如果能从序列化这一步去处理,能处理的更彻底
其实有个简单无脑的方法,就是序列化服务器数据前,手动剔除掉不需要的组件。但是我想看看有没有更高级一点的做法
B不继承ISerializeToEntity就不会跟随序列化
egametang 我这边也在纠结这个问题,比如玩家组件,我是这样设计的: Player组件设计成Share(客户端和服务器共用的一部分数据),然后服务器还有个PlayerServer组件是AddComponent在Player组件上的,这个PlayerServer组件中的数据是不能发给客户端的。就是说在客户端玩家进入的时候数据序列号化时是需要剔除PlayerServer的,但是在服务器保存Player数据到数据库时又要包含PlayerServer组件。
不知道这种数据结构的设计是否合理?
dred 照我的理解,share是可以被server和client调用或者持有, 但是不能反过来,反过来share存在的意义就没了, 就好比核心库可以被server用,但是server里面的东西不能被核心库使用。
evalli 是说如果一个组件设计成了Share,那么包括附加在它身上的Component和ChildComponent都应该是可以Share的?是这个意思吗?
dred 是的, share不要去addchild或者addcomponent server和client里面的组件, share层的组件只能单向被server和client使用。 不能反过来
evalli 如果要遵守这个原则的话,比如PlayerServer组件就需独立了与Player组件平行了,其它很多服务器组件比如:签到SignServer组件等都AddCompoent到PlayerServer组件上?这样写起来会麻烦些
dred 我用了个简单粗暴的方式,就是先序列化一次完整的,给客户端用,然后再把所有ET.Client下的移除掉,再序列化给服务器用
dred 我目前的设计是,一个组件想设计为share的话,就设计。没必要关注这个组件身上的其他所有组件是否share。如果想要实现客户端和服务端的这个share有不同的组件。那么可以存在这个组件的3个system,分别放在client,server,share中。那么client和server有单独的初始化方法。客户端和服务端在挂载的时候分别调用就可以实现了。
7gxz 哈哈,我们是反过来的,我这边是有些服务器的数据不能发给客户端,过滤服务器的组件。
我这边新增了一个 ISerializeToEntityServer 特有接口用来区分
laoyao 哈哈,兄弟,我们应该说的不是一个问题。你说的组件设计成Share的这种方式是很好的,之前我们在一个专贴有讨论过,我现在也是用的这种写法的。
这次讨论的问题应该是客户端获取数据时,服务器会在序列化成byte[]数组时会过滤掉一些附加的组件