记录一下心得.以及各个类的用处

20190408172555924

一些说明:
GameInstance: 游戏进程 ,他是全局唯一的,生命周期是从你开始游戏到退出程序,适合做一些设置,变量储存等
GameMode: 游戏模式用于服务器内部逻辑 它只存在于服务器上,生命周期只在一个关卡里有效
GameState: 存在于客户端和服务器,生命周期是在关卡里有效,默认启用复制,用于让客户端看到服务器在做什么。应该只用于全部用户相同的属性信息,比如游戏倒计时变量,客户端只能获取游戏状态,不能修改游戏状态,做修改应当让服务器操作,例如请求游戏模式去同步或者修改游戏状态内的变量
PlayerState: 存在于客户端和服务器,生命周期是在关卡里有效,默认启用复制,如果玩家的变量信息是唯一的,比如生命值变量 并且需要给全部客户端看见,变量应该存在玩家状态,进程数量是同玩家个数
PlayerController: 相当于玩家大脑,存在于客户端和服务器,生命周期是在关卡里有效,如果变量数据功能只运行在服务器和客户端之间,应该写到玩家控制器
Pawn/Character: 玩家角色,玩家控制器控制的角色,存在服务器和客户端,会被复制,生命周期是关卡有效,进程数量是同玩家个数

变量或事件 Replicated(复制):复制的意思是,当服务器有一个变量A,它会将A发送到全部客户端上,当开启复制这会让变量从服务器单向复制到所有客户端上
变量 OnRep(复制并通知): 这会让变量从服务器复制到所有客户端,当变量被改变时全部客户端会运行OnRep函数,复制并通知变量如果客户端修改会被舍弃,只能服务器修改
Actor网络剔除: 当超过指定距离后,Actor会被剔除(从你本地移除)以节省宽带,到一定距离后又会被服务器复制到你客户端上
复制运动 : Actor的位置信息会被服务器拷贝,并且会发到客户端

on run server服务器运行: 只在服务器上运行
multicast多播: 意思是让全部客户端运行 只能由服务器运行
在拥有的客户端上运行: 只能由服务器运行

RPC(Remote Produce Call远程过程调用):
意思是远程执行某一主机上的函数,执行必须由服务器发起,RPC一次相当于同步了一次属性(全部客户端上的镜像做了一件事)
但RPC是一瞬的执行,后进来的玩家会丢失RPC,即不会收到RPC消息
RPC的执行过程: 事件服务器运行 > 事件组播 >所有客户端运行事件
RPC适合做一些即时同步,比如用RPC给全部玩家播放声音,同步传送等

客户端没有拥有actor执行服务器函数会被抛弃,可能报:
LogNet: Warning: UNetDriver::ProcessRemoteFunction: No owning connection for actor XXXX. Function SetTerminaIndex will not be processed.

Pawn/Character复制:
客户端与客户端之间是无法通信的,相互无法调用,必须经过服务器,因为客户端是属于服务器拷贝,这也防止了外挂,因为客户端是无法做到修改其他客户端的,包括地图场景上的东西都不属于客户端,这和Actor拥有者有关系,你没有拥有网络权限你无法控制,假设客户端生成Actor,客户端本地生成的Actor别人是看不见的,如果想同步,必须请求服务器创建,除非生成的Actor只存在本地。客户端做任何重大决策,都应该交给服务器做决策。否则发生不同步的问题。
image

你能看见客户端玩家跑动是因为服务器已经知道你和这个玩家客户端有关联,服务器就会从自己身上拷贝这个玩家角色到你的玩家本地,这样你的客户端就会有一个角色在跑的拷贝。之所以你看得见他在跑,是因为服务器把位置,速度等属性都拷贝给你跑动的那个客户端了。
简而言之,服务端会一直同步主机的游戏状态和游戏里的各种重大决策,服务端会在客户端上面复制自己的东西,这些是可能有不一样的,服务端还可以复制事件来调用客户端上的对应函数。
image-1666647352823

不是所有角色,Actor都需要被复制,比如有一个角色都不在你的视野里,你看不见他,你就没有必要去浪费宽带一直发送同步消息,很多变量也不需要同步,比如AI的计算过程,或者玩家独有的本地变量,客户端只要知道这里需要显示什么,做什么动画等,还有只运行在服务端上的函数也不需要同步给客户端。