面经-ue知识

本文最后更新于:2026年3月26日 晚上

永星

ue常用的反射宏有哪些?绑定的时候有没有踩什么坑?

native和一个什么没听清有什么区别

Uboject的生命周期?会遇到什么函数

TObject和SoftObject的区别?垃圾回收有什么区别这两个

硬引用(Hard Reference)

定义:

  • 直接指针引用,如 UObject、UClass

  • 资源在包含它的对象加载时会被自动加载到内存

1
2
3
4
5
6
// 硬引用示例
UPROPERTY(EditAnywhere)
UAnimMontage* HardReferenceMontage; // 直接指针

UPROPERTY(EditAnywhere)
UClass* HardReferenceClass; // 直接类指针

优点:

  • 使用简单,直接访问

  • 自动管理,无需手动加载

  • 类型安全,编译时检查

缺点:

  • 内存占用:资源会立即加载

  • 加载时间:形成依赖链,导致大量资源一起加载

  • 循环依赖风险:可能导致资源无法卸载

使用场景:

  • 核心资源,必须立即可用

  • 小资源,内存占用可接受

  • 频繁使用的资源

软引用

定义:

  • 只存储资源路径字符串,不立即加载资源

  • 使用 TSoftObjectPtr、TSoftClassPtr 或 FSoftObjectPath

1
2
3
4
5
6
7
8
9
10
11
// 软引用示例(来自你的代码库)
UPROPERTY(EditDefaultsOnly)
TSoftObjectPtr<UAnimMontage> DefaultExpression; // 软引用动画蒙太奇

UPROPERTY(EditDefaultsOnly)
TSoftObjectPtr<UStaticMesh> ExpressionPlaneStaticMeshSoftPtr; // 软引用静态网格

// 使用时需要手动加载
UAnimMontage* Montage = DefaultExpression.LoadSynchronous();
// 或异步加载
DefaultExpression.LoadAsync();

优点:

  • 延迟加载:只在需要时加载

  • 减少内存占用:不立即加载到内存

  • 加快启动速度:避免加载不必要的资源

  • 更好的资源管理:可以控制加载时机

缺点:

  • 需要手动加载:代码更复杂

  • 可能为空:需要检查资源是否加载成功

  • 异步加载:需要处理回调

使用场景:

  • 可选资源:可能不使用的资源

  • 大型资源:纹理、模型等

  • 按需加载:根据游戏状态动态加载

  • 减少启动时间:延迟加载非关键资源

GC区别

  • 硬引用:阻止 GC,对象会一直保留在内存中

  • 软引用:不阻止 GC,对象可以被回收,需要时重新加载

  • 弱引用:不阻止 GC,用于避免循环引用

对象销毁后行为
FSoftObjectPtr 在一定时间内仍然可以访问已销毁的对象,直到垃圾回收期间。FWeakObjectPtr 会自动失效(置为空指针),不会访问到已销毁的对象。

UMG和SlateUI的区别?

UMG是蓝图,可以绑脚本

Slateui更底层,就是编辑器那些的ui

手柄的组合键是什么做的?

动态修改InputSetting里的ActionMapping按下技能组合键时,把原先 ”X键映射Attack” 删掉,新增一条 ”X键映射Skill1”松开技能组合键时,把 ”X键映射Skill1” 删掉,重新加入 ”X键映射Attack”

这样做有个问题,有可能出现时序问题

时序

解决办法:加一道工序,如果正在按下,就松开的时候再替换,绑一个回调

image-20260123143905157

思路就是修饰键

  • 组合键通常需要一个“修饰键”(如 GamepadUseSkill)作为触发条件

  • 按下修饰键时,临时改变其他按键的行为

  • 释放修饰键时,恢复原始映射

这样可以实现:

  • 单独按 y:执行原始功能

  • 按住 x + 按 y:执行组合功能(如技能1)

  • 按住 x + 按其他键:执行对应的组合功能

这是典型的手柄组合键实现方式,类似键盘的 Ctrl/Cmd + 其他键的组合。

enhance输入什么的

增强输入:

https://dev.epicgames.com/documentation/zh-cn/unreal-engine/enhanced-input-in-unreal-engine

IMC Mapping和Action的区别是什么

按键响应的顺序是什么?

输入过程

网易

实现一个队列,要求不重复怎么搞?

listview怎么优化的?

怎么做一个eventmanager?

恢复这个任务怎么恢复的?会不会影响场景中的东西?

深蓝

植被随机变稀疏是怎么搞得?

样条曲线实现逻辑

UobjectGc的逻辑?什么时候会被gc?

节点怎么跳到任务?

萨罗斯

Ue的game play框架?Ds、基础的类分别有什么用?

C++怎么到lua?lua怎么到C++?

反射机制如果暴露给蓝图的?

自研引擎和ue有啥区别?

TCPheUDP区别?射击游戏一般用哪种?PUBG用了哪种?UE用的哪种?

UDP如何实现握手?几种方式?可靠性如何保证?

GC

UE4 垃圾回收 - 南京周润发的文章 - 知乎

AActor生命周期

浅析 UE Actor 生命周期管理

  1. PostLoad/PostActorCreated - 执行构建 Actor 所需的任何设置。PostLoad 用于序列化 Actor,PostActorCreated 用于生成 Actor。
  2. AActor::OnConstruction - Actor 的构造函数,蓝图 Actor 在此函数中创建其组件并初始化蓝图变量。
  3. AActor::PreInitializeComponents - 在对 Actor 的组件调用 InitializeComponent 之前调用
  4. UActorComponent::InitializeComponent - actor 的 components 数组中的每个组件都会被调用初始化函数(如果该组件的 bWantsInitializeComponent 为 true)。
  5. AActor::PostInitializeComponents - 在 Actor 的组件初始化完成后调用
  6. Actor::BeginPlay - 关卡开始时调用

UE官方文档Actor生命周期

UE 动画系统框架介绍及使用 - TurBo强的文章 - 知乎

Two Bone IK - silvergp的文章 - 知乎

其实很简单,就是想象最后是一个三角形,所以可以这样就知道了三个边的长度(因为ac=at),然后就可以求出角的大小,角的大小就是bat-bac,然后就可以旋转过去,这里用个旋转矩阵就可以了,然后就又可以求出其他的了

img

UE 动画系统框架源码解析 - TurBo强的文章 - 知乎

这个文章还介绍了许多大佬的文章

Motion Mathcing

Motion Matching 中的代码驱动移动和动画驱动移动 - 小木子的文章 - 知乎

GC优化方法?

这篇有优化相关的介绍

UE4 垃圾收集大杂烩 - Jiff的文章 - 知乎

通常GC会引起问题都是在LevelStreaming的时候,不过如果你在代码中申请了大规模的UObject,在不再使用的时候也不删除。或者频繁而无意义的调用ForceGC,自然也可能会造成性能问题。

为了避免LevelStreaming造成的GC瞬间成本,可以通过缩小细分关卡的规模来进行。

这样的话在进行角色的移动时,就可以形成小规模的载入和移除,而不是一次性的大规模变更。

设置这个可以减少遍历成本

image-20260204160723179

Cluster


面经-ue知识
https://rorschachandbat.github.io/找工作/面经-ue知识/
作者
R
发布于
2026年3月26日
许可协议