ue4同步填坑

在PlayerController中只执行一次服务器事件

    在PlayerController中,若只想在游戏开始时,只执行一次服务器事件,那么事件就得写在服务器的本地PlayerController中的。如图服务器

                       

权威版和非权威版--我的这么认为的spa

假如进行一个二人游戏,那么服务器上就有两个PlayerController,客户端只有一个PlayerController.net

  1. 权威版就是服务器上的PlayerController,一个PlayerController是服务器的权威版,同时该PlayerController也是服务器的本地PlayerController,另一个PlayerController是客户端的权威版PlayerController。
  2. 非权威版就是客户端上的PlayerController,该PlayerController是客户端本地的PlayerController,该PlayerController是服务器端的权威版PlayerController 复制/同步 过来的。

GameInstance

    单独存在每一个连接中/或者说是窗口中,服务器上修改的变量不会同步到全部的客户端blog

因此得依靠GameState去同步给客户端游戏

    因为咱们在服务器调用SetRoomName,实际上是能够不用设置为在服务器上执行自定义事件的,可是这样能够防止客户端(非权威)执行该事件事件

设置房间

    在多人游戏会话中,以建立房间,设置房间名字为例子get

    在GameInstance中设置RoomName不须要设置服务器上的GameInstance同步

缘由有两点io

  1. GameInstance单独存在每一个Game中/每一个窗口中/每一个链接的客户端中
  2. 当建立完房间后,若是是客户端建立房间,那么本客户端将成为监听服务器

    固然咱们想要让全部人看到房间名字,因此咱们就得在服务器上设置房间名,因此咱们在GameState中设置了RoomName变量

Widget蓝图部分节点----设置RoomName节点

它将在PlayerController中被调用

PlayerController蓝图部分节点

    以前在客户端建立房间的时候,一直认为得首先呼叫服务器事件,而后在这个事件里去获取服务器的GameInstance,而后设置RoomName,然而这样作不会有错误,也能够在服务器事件中获取到GameInstance,可是在逻辑上就说不通了。(然而这段标注为红色的也是错误的,在这段话中,说是要去获取服务器的GameInstance,然而获取的仍是本地/客户端的GameInstance,由于若是是在客户端的Widget是没有对应权威版的Widget的。例如PlayerController,在客户端中,做为客户端,咱们拥有两个PlayerController,一个权威版/服务器版,一个非权威版/本地版,那么咱们去呼叫服务器事件的话,其实就是在权威版的PlayerController中去执行这个事件。因此在Widget中去呼叫服务器事件,其实也是呼叫了本地的Widget,由于Widget只存在于客户端中)

    其实在会话/建立房间这种模式中并不须要在服务器上设置RoomName,由于建立完房间后,自己将会成为服务器(监听服务器),即客户端的GameInstance也自动变成服务器的,而原来服务器的自动成为客户端

证实OnServer----服务器事件是呼叫权威版的事件

在其所属的客户端上运行

详细跳转

会话

    在查找会话完成后,记得先销毁上次的会话

    这是因为当服务器退出游戏时候,不会自动销毁其余客户端的Session,因此得去销毁上次的会话,不然虽然能够找到会话,可是加入不了,由于会话已经存在了

相关文章
相关标签/搜索