[20] C++虚幻引擎热更新
Day1
大纲
行为树节点
网络PDF
网络系统
内容
Task节点
FinishWithResult :
MoveDirectlyToWard :
Push PawnAction : 运行至当前队列节点首节点
Run Behavior Dynamic : 动态运行子行为树
Set Tag Cooldown :
Wait Blackboard Time :
装饰器节点
GamePlay Tag Condition : 检查目标身上有没有标签 , 做出行为
compare BBEntries :
Conditional Loop :
Cone Check && Keep in Cone :
Cooldown : 每延迟**事件执行一个节点
Does Path exist :
Is at Location :
Is Blackboard value of given Class :
重写分发节点 随机执行
网络系统
- 监听服务器: LS 有一个用户充当房主,小范围
- 专用服务器: DS 大范围
- 客户端: Client
蓝图同步设置 :
Net Load On Client : 地图加载是此Actor将在网络客户端上加载。
Replicates : 决定有没有能力在网络中进行同步 , 还要进行属性同步。
PRC
• Server 在持有当前Actor客户端调用,在服务器端执行(Server标记产生在客户端是合理的)
• Client在服务器端调用,在持有对象的客户端执行(Client标记在服务端调用是合理的)
• Multicast 在服务器端调用,在所有终端执行(Multicast标记在服务端调用是合理的)
只有PlayerController,Pawn,PlayerState才有权利发消息给服务器
设置拥有者
设置客户端的盒子所属于服务端的控制器&&pawn , 让盒子知道自己的归属终端
本地函数
TIPS
先做本地在做联网
没有返回值不能做纯函数
如果ModeBase , GameState也要用Base , 联网不要用Base ,
RPC一般在函数内部调用
节点
Switch Has Authority : 判断是否服务端
Get Game State -> Player Array : 当前玩游戏的所有玩家
Day3
大纲
属性同步
优化
2个终端链在一
内容
蓝图属性同步和带有通知的属性同步
属性同步 : 需要在Tick里面一直执行监听值的变化
带通知的属性同步有绑定函数在值个更改的时候会触发
CPP属性同步和带有通知的属性同步 && Multi、Server、Client调用
Multi、Server、Client
//--生命
UFUNCTION(NetMulticast, Reliable)//多播、标记为可靠
void Multi_ChangeBodyColorCpp(FVector Color);
UFUNCTION(Server, Reliable, WithValidation)//服务器调用、标记可靠、标记验证
void Server_ChangeBodyColorCpp();
UFUNCTION(Client, Reliable)//客户端调用
void Client_ChangeBodyColorCpp(FVector Color);
//--定义
void AMyCharacter::Multi_ChangeBodyColorCpp_Implementation(FVector Color)
{
GetMesh()->SetVectorParameterValueOnMaterials(TEXT("Color"), Color);
}
void AMyCharacter::Server_ChangeBodyColorCpp_Implementation()
{
ChangeMeshColor();
}
bool AMyCharacter::Server_ChangeBodyColorCpp_Validate()//如果范围False会被踢下线
{
return true;
}
void AMyCharacter::Client_ChangeBodyColorCpp_Implementation(FVector Color)
{
GetMesh()->SetVectorParameterValueOnMaterials(TEXT("Color"), Color);
}
属性同步
UPROPERTY(Replicated)//无通知 靠Tick变换
FVector MeshColorCpp;
UPROPERTY(ReplicatedUsing="OnRep_MeshColorRepCpp")//有通知 靠通知绑定的函数调用
FVector MeshColorRepCpp;
if (HasAuthority())//是不是服务端
{
// Multi_ChangeBodyColorCpp(GetRandomColor());
// Client_ChangeBodyColorCpp(GetRandomColor());
// MeshColorCpp = GetRandomColor(); //无通知
MeshColorRepCpp = GetRandomColor(); //有通知
OnRep_MeshColorRepCpp();//通知回调
}
//设置属性复制的声明周期
void AMyCharacter::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(AMyCharacter, MeshColorCpp);
DOREPLIFETIME(AMyCharacter, MeshColorRepCpp);
}
CPP调试模式按键输入
//响应按键事件 Deubgger
if (APlayerController* Pc = Cast<APlayerController>(GetController()))
{
//按键事件
if (Pc->WasInputKeyJustPressed(EKeys::Q))
{
ChangeMeshColor();
}
}
优化
网络同步相关设置
-
Only Relevant to Owner:
- 这个设置用于指定属性是否仅对拥有该 Actor 的客户端进行同步。如果启用了这个选项,只有拥有连接的客户端会接收到该属性的更新。
- 举个例子,如果你在一个多人游戏中创建了一个角色,那么该角色的位置、旋转等属性将仅在你自己的客户端上同步,其他玩家不会看到这些变化。
-
Always Relevant:
- 这个选项表示该属性始终对所有客户端进行同步。无论是否拥有连接,所有客户端都会接收到该属性的更新。
- 如果你希望某个属性在所有客户端之间保持同步,可以启用这个选项。
-
Replicate Movement:
- 这个设置用于控制 Actor 的移动是否在网络上同步。如果启用了这个选项,Actor 的位置、旋转和缩放等移动属性将在所有客户端之间同步。
- 这对于需要在多人游戏中同步角色位置的情况非常重要。
-
Net Load on Client:
- 这个选项决定了客户端是否加载该 Actor。如果启用了这个选项,客户端会加载该 Actor,否则不会加载。
- 这对于优化客户端性能和减少不必要的资源加载很有用。
-
Net Use Owner Relevancy:
- 这个设置与 Owner 相关。如果启用了这个选项,只有拥有连接的客户端会根据 Owner 的相关性来决定是否加载该 Actor。
- Owner 是指拥有该 Actor 的 PlayerController。这样可以确保只有与 Owner 相关的客户端会加载该 Actor。
-
Replicates:
- 这个属性用于标记 Actor 的属性是否需要在网络上同步。如果设置为 true,该属性将在所有客户端之间同步。
- 如果设置为 false,该属性将不会同步,只会在拥有连接的客户端上更新。
-
Net Dormancy:
- 这个设置用于控制 Actor 的休眠状态。如果启用了这个选项,不活跃的 Actor 将进入休眠状态,不再同步属性。
- 这对于优化网络性能和减少不必要的数据传输很有用。
-
Net Cull Distance Squared:
- 这个属性用于指定 Actor 在多远距离之外将不再同步。如果 Actor 超出了这个距离,它将被视为不活跃,不再同步属性。
- 这对于减少不必要的网络流量和提高性能很有帮助。
对于动态Actor和静态的影响
动态生成的场景道具 , 如果相关性无关会隐藏 , 但是静态的道具不会 。
复制对象引用
勾选复制选项 , 网络ID , 所有网络中存在的对象都有个网络ID , 解决多终端中同步
可靠性命名
所有场景中存在的物体都叫
创建会话、加入、查找
TIPS
千万不要在Tips里面执行RPC函数切标记可靠
节点
Player State网络同步节点
Day4
大纲
转移地图携带参数
创建高级Session
蓝图函数库
内容
地图跳转携带人物状态
CopyProperties函数调用时机
1. 玩家重连接
当玩家断线并重新连接时,新的 PlayerState
实例会从旧的 PlayerState
实例中复制属性。这确保了玩家在断线重连后能够保持之前的状态。
2. 关卡切换
在某些情况下,当玩家切换关卡时,新的 PlayerState
实例会从旧的 PlayerState
实例中复制属性。这确保了玩家在新关卡中能够保持之前的状态。
3. 玩家角色变化
当玩家角色发生变化时(例如,重新生成角色),新的 PlayerState
实例会从旧的 PlayerState
实例中复制属性。这确保了玩家角色变化时能够保持之前的状态。
转移地图设置
插件 : 使用高级会话插件 , 创建房间、加入房间、
创建
查找
查找出来后创建房间列表UI初始化
加入
全局模态框
使用蓝图静态函数库吧函数封装在HUD上面的方法 , 调用Show和Hide来显示隐藏
FText格式化文本
WaitTextBlock->SetText(NSLOCTEXT("WaitUI", "k1", "请等待...")); //文本
WaitTextBlock->SetText(FText::Format(NSLOCTEXT("WaitUI", "k2", "请等待({0})..."), FText::AsNumber(WaitTick))); //数字
静态函数库
Tips
UMG Remove掉的话会自己被内存回收机制回收
Day5
大纲
游戏大厅
聊天框
内容
UFUNCTION(BlueprintImplementableEvent)
的应用
TIps
节点API
GameState
virtual void AddPlayerState(APlayerState* PlayerState) override;
virtual void RemovePlayerState(APlayerState* PlayerState) override;
/*
AddPlayerState 在玩家加入游戏时触发,用于将新玩家的状态(例如 APlayerState 类的实例)添加到游戏状态中。通常在玩家连接到游戏服务器时调用此函数。
RemovePlayerState 则在玩家离开游戏时触发,用于将已离开的玩家状态从游戏状态中移除。通常在玩家断开与游戏服务器的连接时调用此函数。
*/
PlayerController
//在控制器获取PlayerState
GetPlayerState<AHallPlayerState>()
//返回当前游戏模式实例,该实例在服务器上的游戏过程中始终有效。
//这将只返回服务器上的一个有效指针。将始终在客户端返回null
GetWorld()->GetAuthGameMode()->GetGameState<AHallGameState>()
//所有PlayerStates的数组,维护在服务器和客户端(PlayerStates总是相关的)
Gs->PlayerArray