跳至主要內容
NT-2.4|网络优化|结构体

本章概要

以方向为例,优化方向结构体的网络传输

问题

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")
};

Mr.Si大约 2 分钟unreal
NT-2.4|网络优化|网络抖动

1. bIgnoreClientMovementErrorChecksAndCorrection

  • 用途:

    • 当这个参数设置为 true 时,服务器会忽略来自客户端的移动误差修正请求。
    • 默认情况下,服务器会监控客户端的移动状态,如果发现客户端的位置和服务器位置之间有显著差异,服务器会进行位置纠正,将客户端“拉回”正确的位置。
    • 开启这个参数后,服务器将不再做这种误差校正,从而避免频繁的客户端位置纠正。但这样做可能会允许客户端稍微偏离服务器记录的位置。
  • 适用场景:

    • 在某些网络游戏中,如果移动非常频繁,位置纠正可能会导致玩家感觉卡顿。使用 bIgnoreClientMovementErrorChecksAndCorrection 可以减少这种不必要的“位置拉扯”。
    • 它更适合那些对位置精确度要求不高的场景,比如开放世界中的一些非战斗场景。

Mr.Si大约 2 分钟unreal
LY2.Lyra-UIMessaging

项目说明:

ExorcistUIMessaging 是一个用于在游戏中展示全局消息框(MessageBox)的子系统,支持错误、确认等提示信息。 它基于 MVC 设计模式实现,通过异步蓝图节点来展示消息,能够简化用户与系统之间的交互。

功能:

主要模块:

  1. UAsyncAction_ShowConfirmation
UFUNCTION(BlueprintCallable, BlueprintCosmetic, meta = (BlueprintInternalUseOnly = "true", WorldContext = "InWorldContextObject"))
static UAsyncAction_ShowConfirmation* ShowConfirmationYesNo(
    UObject* InWorldContextObject, FText Title, FText Message
);

Mr.Si大约 2 分钟unreal
P2.物体点击高亮

PlayerController中的高亮功能

1. 添加高亮启动/关闭/检测

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);
    }
}

Mr.Si大约 2 分钟unreal
HF|热更新01

问题描述

知识拓展

什么是热更新?

热更新(Hotfix or Hot Update)是一种在软件运行过程中无需停止或重启应用程序的情况下,直接对程序进行更新的方法。

UEPC端打包目录结构?

以下是添加了目录注释的版本,解释每个文件夹的用途和内容:

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                                // 打包文件目录,包含已打包的游戏内容(如贴图、模型等)

Mr.Si大约 8 分钟unreal
HF|热更新02

前情回顾

前文中我们已经讨论了两个基础的更新方案,并意识到恶意破坏补丁可能带来的严重问题。本文将继续探讨如何优化和完善我们的方案。

校验

获取文件MD5(HASH)

FMD5Hash CurrentPakHash = FMD5Hash::HashFile(*InFile);
FString CurrentPakHashString = LexToString(CurrentPakHash);

Mr.Si大约 3 分钟unreal
NT-2.3.1|UObject复制同步和RPC

本章概要

非Actor对象,比如原生的UObject如何实现同步?以及调用RPC

问题

服务端上查看客户端显示正常
客户端上可以看到UObject为未知

变量同步

1. 重写 IsSupportedForNetworking

在自定义 UObject 类中重写 IsSupportedForNetworking 函数,使其返回 true,标记该对象支持网络复制。


Mr.Si大约 2 分钟unreal
NT-2.3.2|网络同步PushModel

本章概要

ReplicatedUsing同步触发条件 蓝图和C++的区别

问题

1. 准备一个组件设置为可复制

2. 新建一个数组变量,并且使用ReplicatedUsing标记为可复制。

3. 增加1个RPC,标记为Server执行,用于添加内容到数组


Mr.Si大约 3 分钟unreal
P1.ViewLock

思考

方案1

发射简单射线

方案1|问题


Mr.Si大约 3 分钟unreal