当前位置:首页 > 技术 > 正文内容

UE核心知识点解析

访客 技术 2026年5月22日 20

平面表示

UE中平面通过方程Ax+By+Cz=W进行描述。当W=0时,平面经过原点;当W>0时,平面正空间不包含原点;当W<0时,平面正空间包含原点。

struct FPlane {
    float W; // 存储平面法线与平面上某点的点积
};

投影矩阵

正交投影矩阵

class FOrthoMatrix : public FMatrix {
public:
    FOrthoMatrix(float width, float height, float zScale, float zOffset);
};

透视投影矩阵

class FPerspectiveMatrix : public FMatrix {
public:
    FPerspectiveMatrix(float halfFovX, float halfFovY, float multFovX, float multFovY, float minZ, float maxZ);
    FPerspectiveMatrix(float halfFov, float width, float height, float minZ, float maxZ);
    FPerspectiveMatrix(float halfFov, float width, float height, float minZ);
};

坐标转换

FMinimalViewInfo viewInfo; // 视图信息对象
FMatrix viewMatrix; // 视图变换矩阵
FMatrix projMatrix; // 投影矩阵
FMatrix viewProjMatrix; // 视图投影矩阵

void CalculateMatrices() {
    projMatrix = FReversedZPerspectiveMatrix(
        FMath::Max(0.001f, viewInfo.fov) * (PI / 360.0f),
        viewInfo.aspectRatio,
        1.0f,
        viewInfo.nearClip
    );

    // 视图矩阵构造逻辑省略
    viewProjMatrix = viewMatrix * projMatrix;
}

目标指示器实现

void UpdateTargetIndicator(const AActor* target, const AActor* player) {
    if (!target || !player) return;

    FVector playerPos = player->GetActorLocation();
    FVector targetPos = target->GetActorLocation();

    FRotator viewRot = player->GetViewRotation();
    FVector forwardDir = viewRot.Vector();
    FVector rightDir = UKismetMathLibrary::GetRightVector(viewRot);

    FVector direction = (targetPos - playerPos).GetSafeNormal2D();
    
    float dotForward = FVector::DotProduct(forwardDir.GetSafeNormal2D(), direction);
    float dotRight = FVector::DotProduct(rightDir.GetSafeNormal2D(), direction);

    float angle = UKismetMathLibrary::DegAcos(dotForward);
    angle *= (dotRight >= 0) ? 1.0f : -1.0f;

    // 更新UI角度
    indicatorWidget->SetRotationAngle(angle);
}

类继承判断

class UObject {
public:
    bool IsA(const UObject* other) const { /* 实现逻辑 */ }
};

class UActor : public UObject {
};

// 使用示例
AActor* myActor = ...;
if (myActor->IsA<AActor>()) {
    // 类型判断通过
}

CDO类默认对象

UClass* actorClass = AActor::StaticClass();
AActor* defaultActor = actorClass->GetDefaultObject<AActor>();

系统子类生命周期

  1. 引擎子类 (UEngine)
  • 唯一实例,从启动到关闭始终存在
  • 通过GEngine全局访问
  1. 编辑器子类 (UEditor)
  • 编辑器独有,编辑器启动时创建,关闭时销毁
  1. 游戏实例子类 (UGameInstance)
  • 每个游戏会话一个实例
  • 生命周期与游戏运行时间一致
  1. 世界子类 (UWorld)
  • 每个世界一个实例
  • 生命周期与GameMode一致
  1. 本地玩家子类 (ULocalPlayer)
  • 支持多本地玩家
  • 生命周期与GameInstance一致

UMG组件

根容器

  • UserWidget: 用户界面根容器
  • PanelWidget: 布局容器,不直接渲染
  • CommonWidget: 基本渲染组件(如文本、按钮)

性能优化

  • RetainerBox: 控制UI刷新频率,默认每秒30帧
  • InvalidationBox: 用于缓存不经常变化的UI

关键属性:

  • CanCache: 是否允许缓存
  • CacheRelativeTransforms: 是否缓存相对变换
  • IsVolatile: 是否为易变控件

场景遍历

for (TActorIterator<ACharacter> actorItr(GetWorld()); actorItr; ++actorItr) {
    ACharacter* character = *actorItr;
    // 处理角色
}

注意事项:

  • 避免在编辑器中直接遍历蓝图实例
  • 使用适当的迭代器模板根据需求遍历不同类型的 Actor
标签: Unreal Engine

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。