Gameplay网络基础
基于会话的实时游戏:查找(找到别人的服务器),链接(加入到别人的服务器),同步(同一时间发生的事情都能接收)。
游戏是由输入和状态组成的,玩家输入按键对应技能移动,状态对应死亡,奔跑,攻击,被攻击等等。
点对点 p2p(peer two peer)
UE并没有使用点对点模型,原因1扩展性差2网络连接速度不确定3不公平易作弊。优点:方便只有两个人的时候用点对点模型最佳!
UE使用的是客户端服务器模型(Client-Server)
解决了点对点模型的缺点,由服务器判断客户端的内容真实。总结服务器永远是最权威的,客户端的消息不能相信。
Gamepaly
是指游戏规则、玩家输出与控制、相机和用户界面等核心系统。
AActor->UObject。可以相互嵌套,拥有tick,网络通信通道(指网络同步),组件的容器(其它组件可以挂在上面),可生成的不是所有的actor都是可见的。WorldSetting和关卡蓝图都是actor。
Compoent分ScenceComponent和ActorComponent,ScenceCom可以嵌套拥有世界坐标继承与ActorCom,而ActorCom不可以也没有坐标设置。
Com代表一种能力,可以给Actor提供能力与代码逻辑无关只要使用UE引擎都能使用。
APawn包括ACharacter(人物人性类型的类)和AdefaultPawn(自定义的类,小灰球)->ASpectatorPawn(观众视角的,观看比赛)
可被控制,采用MVC设计,相当于容器。而controller相当于灵魂用来控制pawn,这两个是要连起来一起看。用来写攻击方式比如用枪用手等等。
Controller包括APlayerController(控制玩家即主角)和AAIController(控制怪物)移动攻击相关,但攻击类型方式则是在pawn里面。注:PlayerIndex是给分屏游戏用的,如魂斗罗这种双人游戏。
APlayerState
继承于AInfo,记录pawn和controller的状态。
AGameMode
游戏规则世界规则,一般规定游戏怎么玩,如何胜利。最权威只存在于服务器。继承AInfo->AGameModeBase->AGameMode
AGameState
世界的状态,可以通过网络通知到客户端。继承AInfo->AGameStateBase->AGameState
UGameInstance
游戏的全局实例,可以跨关卡保存数据,不进行网络复制。
继承 UGameEngine->UGameInstance->FWorldContext->UWorld。
USaveGame
游戏存档,数据保存到本地。一般存档保存继承与该类,不继承网络复制。
USubsystem
业务逻辑的组件,自动实例化对象,托管的生命周期。有五类生命周期
- UEngineSubsystem-UEngine*Gengine
- UEditorSubsystem-UEditorEngine*GEditor
- UGameInstanceSubsystem-UGameInstance*GameInstance
- UWorldSubsystem-UWorld*World
- ULocalPlayerSubsystem-ULocalPlayer*LocalPlayer
多人联机中的GamePlay划分
ServerOnly:仅存在服务器(GameMode)。Server Clients:存在服务器和所有客户端(AGameState,APlayerState,APawn)。Server Owning Client:存在服务器与拥有的客户端(APlayerController)。Owning Client Only:仅存在拥有的客户端(UMG,AHUD)。
专用服务器和监听服务器
专用服务器:不需要客户端的独立服务器,与游戏客户端分开运行,没有可视部分,在游戏中也没有代表他们的角色。
监听服务器:是服务器的同时也是客户端,始终至少连接一个客户端,如果断开连接,服务器将关闭。拥有可视部分。
总结:监听服务器类似于开房创建的玩家,如游戏DOTA,饥荒。专用服务器不是玩家创建的。
Replication
标记为复制的AActor在服务端生成的同时也会在客户端生成,但在客户端生成时仅存在于客户端。
需要设置物体复制SetReplicates(true)和移动复制SetReplicateMovement(true)。
变量属性也可以进行复制,找到Replication有两种模式一种为replicated这个只是单纯的复制,另一个RepNotify这个不仅复制还会提供一个函数,每次数值改变会进行调用。
Role和RemoteRole
ROLE_SimulatedProxyt-----模拟的,由服务器同步过来的,不能控制。
ROLE_AutonomousProxyt-----自制的,自己控制由服务器监管
ROLE_Authorit------权威的,就在服务器上
物体的主控权,如果在服务器看客户端的物体则是权威的,如果是客户端看客户端自己的则是自制的,反之客户端看服务器是权威,看自己不变。
一般判断是否在服务器使用isServer和HasAuthority。
RPC - Remote Procedure Calls——远程过程调用
用于调用在另一个实例上的函数,RPC无返回值,有以下特定规则:Run on Server:将在Actor的服务器实例上执行。Run on owning Client:将在此Actor的所有者上执行。Multicast:在此Actor的所有实例上执行。
RPC注意事项
必须从复制AActor调用。如果从服务器调用RPC以便在客户端上执行,只有实际拥有该Actor的Client才能执行该功能。如果要从Client调用RPC在Server上执行,则Client必须拥有要调用RPC的Actor。
Multicast RPC(多播委托)
如果从服务器调用它们,则服务器将在本地执行它们,并在所有当前连接的客户端上执行它们。
如果从客户端调用它们,它们将仅在本地执行,而不会在服务器上执行。
将RPC标记为Reliable(可靠):确保将执行99.99%的RPC,不要标记所有PRC为可靠,因为会消耗带宽。
RPC可以带Validation(验证):仅支持C++,拥有一个验证函数如,RPC的验证函数检测到任何参数错误,它可以通知系统断开发起RPC调用的客户端/服务器的连接。
(蓝图中使用RPC是需要Event事件,在graph里有replicates属性选择,以及选择是否可靠reliable)
在服务器创建的物体不复制,客户端观看不到但会有作用,如透明墙原理。同样不复制在客户端生成同样会出现透明墙但可以穿过只是会抽搐。如果选择可复制在客户端运行情况和上面一样,但是在服务端生成则全部能看到。