介绍
大约 2 分钟
以方向为例,优化方向结构体的网络传输
UENUM(BlueprintType)
enum class EDirectionType : uint8
{
Forward UMETA(DisplayName = "Forward"),
Backward UMETA(DisplayName = "Backward"),
Left UMETA(DisplayName = "Left"),
Right UMETA(DisplayName = "Right"),
Invalid UMETA(DisplayName = "Invalid")
};
bIgnoreClientMovementErrorChecksAndCorrection
用途:
true
时,服务器会忽略来自客户端的移动误差修正请求。适用场景:
bIgnoreClientMovementErrorChecksAndCorrection
可以减少这种不必要的“位置拉扯”。ExorcistUIMessaging
是一个用于在游戏中展示全局消息框(MessageBox)的子系统,支持错误、确认等提示信息。
它基于 MVC 设计模式实现,通过异步蓝图节点来展示消息,能够简化用户与系统之间的交互。
UFUNCTION(BlueprintCallable, BlueprintCosmetic, meta = (BlueprintInternalUseOnly = "true", WorldContext = "InWorldContextObject"))
static UAsyncAction_ShowConfirmation* ShowConfirmationYesNo(
UObject* InWorldContextObject, FText Title, FText Message
);
void AAuraPlayerController::CursorTrace()
{
// 碰撞通道
const ECollisionChannel TraceChannel = ECollisionChannel::ECC_Visibility;
// 获取光标下的碰撞信息,并存储在CursorHit中
GetHitResultUnderCursor(TraceChannel, false, CursorHit);
// 如果光标下没有阻挡的对象,直接返回
if (!CursorHit.bBlockingHit) return;
// 保存上一个高亮的对象
LastActor = ThisActor;
// 获取当前光标下的对象,并检查其有效性和是否实现了高亮接口
AActor* HitActor = CursorHit.GetActor();
if (IsValid(HitActor) && HitActor->Implements<UHighlightInterface>())
{
ThisActor = HitActor; // 当前对象有效且可高亮,设置为ThisActor
}
else
{
ThisActor = nullptr; // 当前对象无效或不支持高亮,设置为nullptr
}
// 如果当前对象与上一个对象不同,则更新高亮状态
if (LastActor != ThisActor)
{
// 取消上一个对象的高亮效果
UnHighlightActor(LastActor);
// 为当前对象添加高亮效果
HighlightActor(ThisActor);
}
}
void AAuraPlayerController::HighlightActor(AActor* InActor)
{
if (IsValid(InActor) && InActor->Implements<UHighlightInterface>())
{
IHighlightInterface::Execute_HighlightActor(InActor);
}
}
void AAuraPlayerController::UnHighlightActor(AActor* InActor)
{
if (IsValid(InActor) && InActor->Implements<UHighlightInterface>())
{
IHighlightInterface::Execute_UnHighlightActor(InActor);
}
}
热更新(Hotfix or Hot Update)是一种在软件运行过程中无需停止或重启应用程序的情况下,直接对程序进行更新的方法。
以下是添加了目录注释的版本,解释每个文件夹的用途和内容:
D:.
| HOTFIX.exe // 应用名
| Manifest_NonUFSFiles_Win64.txt // 非UFS文件(Unreal File System)的清单,用于描述哪些文件不打包在UFS中
| Manifest_UFSFiles_Win64.txt // UFS文件清单,列出游戏打包时包含的所有UFS文件
|
+---Engine // 引擎文件夹,包含与引擎相关的文件和库
| +---Binaries // 可执行文件和二进制文件的存储目录
| \---ThirdParty // 第三方库目录,包含引擎使用的外部依赖项(如DLL文件)
|
\---HOTFIX // 热更新目录,用于存放热更新相关的文件
+---Binaries // 热更新程序的二进制文件目录
| \---Win64 // 针对64位Windows平台的可执行文件和依赖文件
|
\---Content // 热更新内容目录,存放与热更新相关的游戏内容
\---Paks // 打包文件目录,包含已打包的游戏内容(如贴图、模型等)
前文中我们已经讨论了两个基础的更新方案,并意识到恶意破坏补丁可能带来的严重问题。本文将继续探讨如何优化和完善我们的方案。
FMD5Hash CurrentPakHash = FMD5Hash::HashFile(*InFile);
FString CurrentPakHashString = LexToString(CurrentPakHash);
非Actor对象,比如原生的UObject如何实现同步?以及调用RPC
IsSupportedForNetworking
在自定义 UObject
类中重写 IsSupportedForNetworking
函数,使其返回 true
,标记该对象支持网络复制。
ReplicatedUsing同步触发条件 蓝图和C++的区别