avatar
罗传月武(YueWu)@罗传月武(yuewu)
技术
UE

【GameplayAbility深入解析】之WaitNetSync节点原理

logo unreal

前言

GameplayTask/AbilityTask是在一个游戏技能生命周期内完成各种异步任务的节点,如等待按键按下,等待目标数据等。但其中有一个节点很神奇,叫等待网络同步(WaitNetSync)。我就很神奇了,一个看起来短小精悍的节点,是怎么就能确保服务端客户端都会同时到达某个点后再执行后续操作的呢?来看我分析。

NetworkSyncPoint(WaitNetSync)等待网络同步

a27547c3-58c0-46f1-8c53-78bd3381ed87.jpg

这是一个内部实现比较复杂的异步节点(看了不晕才怪),通过ASC上的通用网络同步事件来确保服务器和客户端同步,如果不明白先看我这一篇文章。

首先这个节点的调用需要服务器版和客户端版本都调用

内部代码虽然都是写在一个节点实现里,但在网络游戏种它的执行流程是根据3种同步类型,每种同步类型服务端和客户端各自走不同的路径,最后形成6条路径。

如果是单机游戏调用这个节点毫无意义,无论哪种同步模式,调用后OnSync马上就会执行。

OnlyClientWait

  • 客户端: 执行到这个节点时,监听所属ASC上的GenericSignalFromServer事件,传入OnSync回调,(调用ASC上的CallOrAddPrelicatedDelegate,这时候执行的是Add操作),等待事件触发,事件触发后执行OnSync从而完成同步。客户端要等待。
  • 服务端:执行到这个节点时,通过RPC触发上面客户端刚才所监听的GenericSignalFromServer事件(调用ASC上的ClientSetReplicatedEvent),然后服务端的OnSync立即调用。服务端不等待。
60dde9a8-36eb-4e27-bc3b-59e4f83c2e7f.jpg

OnlyServerWait

  • 服务端: 执行到这个节点时,监听所属ASC上的GenericSignalFromClient事件,传入OnSync回调,(调用ASC上的CallOrAddPrelicatedDelegate,这时候执行的是Add操作),等待事件触发,事件触发后执行OnSync从而完成同步。服务端要等待。
  • 客户端:执行到这个节点时,通过RPC触发上面服务端刚才所监听的GenericSignalFromClient事件(调用ASC上的ClientSetReplicatedEvent),然后客户端的OnSync立即调用。客户端不等待。
de60317b-9620-4e5a-b6be-ace1e84132d7.jpg

BothWait

  • 客户端: 执行到这个节点时,监听所属ASC上的GenericSignalFromServer事件,传入OnSync回调,(调用ASC上的CallOrAddPrelicatedDelegate,这时候执行的是Add操作),等待事件触发,事件触发后执行OnSync从而完成同步。客户端要等待。同时通过RPC触发下面服务端刚才所监听的GenericSignalFromClient事件。
  • 服务端:执行到这个节点时,监听所属ASC上的GenericSignalFromClient事件,传入OnSync回调,(调用ASC上的CallOrAddPrelicatedDelegate,这时候执行的是Add操作),等待事件触发,事件触发后执行OnSync从而完成同步。服务端要等待。同时通过RPC触发上面客户端刚才所监听的GenericSignalFromServer事件。
06d7949d-210d-468a-91c0-9c40cce9861e.jpg

写到这里,不禁来一句妙啊!最后,真心建议,看虚幻的源码,要从纯客户端,和监听服务器,以及专用服务器分别看一遍,才懂。