Skip to content

Commit dcd3c83

Browse files
committed
update
1 parent 124038f commit dcd3c83

9 files changed

+48
-7
lines changed

_posts/UE/2024-11-24 Reflection Specifier in Unreal.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,7 @@ BlueprintNativeEvent:C++ 中可加个 `_Implementation` 后缀进行定义,
2121

2222
### META
2323
AllowPrivateAccess,如果该 uproperty 使用 BlueprintReadOnly 或 BlueprintReadWrite 标记了,并且是私有成员,那么需要使用 AllowPrivateAccess 标记
24-
BlueprintSpawnableComponent,表示可以通过 SCS 添加进 actor
24+
BlueprintSpawnableComponent,表示可以通过 SCS 添加进 actor
25+
26+
### UInterface
27+
[How do i expose a C++ Interface to Blueprints with a BlueprintCallable function?](https://forums.unrealengine.com/t/how-do-i-expose-a-c-interface-to-blueprints-with-a-blueprintcallable-function/342082) 中提到了 **CannotImplementInterfaceInBlueprint**,此时可以将 ufunction 标记为 virtual
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
官方文档 [Unreal Interfaces](https://dev.epicgames.com/documentation/en-us/unreal-engine/interfaces-in-unreal-engine) 讲得挺好的,但我有几个地方没看懂
22
* `execute_xxx` wrapper,是只有用 UFUNCTION 修饰的才有吗,没有 UFUNCTION 修饰函数我没找到对应的 wrapper
33
* `TScriptInterface` 是个啥,为什么需要它
4-
* 为什么 blueprint implementable interfaces 没办法用 cast 转类型,并且只能用 `Execute_` static wrapper?
4+
* 为什么 blueprint implementable interfaces 没办法用 cast 转类型,并且只能用 `Execute_` static wrapper?
5+
6+
通常 object 类中如果有标记了 `BlueprintNativeEvent` 的 ufunction ABC,那么 UE 这边生成这些东西
7+
* 成员函数 ABC 的定义,

_posts/UE/Animation/2025-03-19 Animation Blueprint in Unreal.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,12 @@ TODO:什么时候 `AnimEvaluationContext.bDoInterpolation` 为 true,它为 t
8989
--> `UPrimitiveComponent::SyncComponentToRBPhysics`:将物理模拟的结果同步回来,使得 `USkeletalMeshComponent` 的 component to world 的 transform 与物理世界保持一致
9090
--> `USkeletalMeshComponent::BlendInPhysicsInternal`
9191
----> `USkeletalMeshComponent::PerformBlendPhysicsBones`:与物理世界的 bone transform 混合,得到最终的 bone space transform 与 component space transform
92-
----> `USkeletalMeshComponent::FinalizeAnimationUpdate`
92+
----> `USkeletalMeshComponent::FinalizeAnimationUpdate`:交换双缓冲,更新子 component 的 transform 和 overlaps
9393
------> `USkeletalMeshComponent::FinalizeBoneTransform`:swap double buffer of component space transform
9494

9595
如果 `ShouldBlendPhysicsBones` 返回 false(即不需要物理动画)则 `USkeletalMeshComponent::FinalizeAnimationUpdate` 将会在 `USkeletalMeshComponent::PostAnimEvaluation` 中被调用
9696
### Modular Characters
97-
根据文档 [Working with Modular Characters](https://dev.epicgames.com/documentation/en-us/unreal-engine/working-with-modular-characters-in-unreal-engine),源码中出现的 `LeaderPoseComponent` 原来是用作d
97+
根据文档 [Working with Modular Characters](https://dev.epicgames.com/documentation/en-us/unreal-engine/working-with-modular-characters-in-unreal-engine),源码中出现的 `LeaderPoseComponent` 原来是用作
9898

9999

100100
TODO:[UE 动画系统框架源码解析](https://zhuanlan.zhihu.com/p/673924647) 讲得很全,需要再看看,以及 [UE4 图解动画系统源码](https://zhuanlan.zhihu.com/p/446851284) 也可以看看

_posts/UE/Basic GamePlay/2024-12-27-Movement and Collision in Unreal.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,10 @@ scene component 默认的实现非常简单,就是更新该 component 和子 c
5555
TODO:捋清移动有子节点的 primitive component 时碰撞逻辑,多个 component 时碰撞盒又是怎样的?如何设置 component 的碰撞盒(我直观上还是觉得应该是父子的碰撞,overlap 检测是相互独立的才对)
5656
* 我把两个 cube 作为父子节点串一块,发现移动父节点时能够正常检测到子节点的碰撞,但好像 collision preset 用的是父节点的设置?即使子节点设置为 overlap 也依然发生的是 blocking hit。但尝试移动子节点时却发现没有检测到碰撞?子节点直接就飞了
5757
* 说到底,多个 component 时 ue 是怎么选的碰撞盒
58-
* 以及 `MoveComponentImpl` 的实现里会递归地调用子节点的 `UpdateOverlaps`,这里的碰撞盒又用的谁的呢
58+
* 以及 `MoveComponentImpl` 的实现里会递归地调用子节点的 `UpdateOverlaps`,这里的碰撞盒又用的谁的呢(看起来就是根据子节点的碰撞盒更新子节点的 overlaps)
5959
* 每个 mesh 的 simple / complex collision 又存储在哪的呢
60-
TODO:skeletal mesh component 的 `MoveComponentImpl` 实现
60+
#### Skeletal Mesh Component
61+
skeletal mesh component 不处理 overlaps,但是它下边可能挂一些需要处理 overlaps 的子 component(例如武器),因此 `MoveComponentImpl` 的实现就是调用子 component 的 update overlaps 函数,更新它们的 overlap 情况(这样的实现的一个缺点就是子 component 的 overlap info 没有详细的几何数据,例如最初发生碰撞的位置,法线等等),另外,在动画改变了 skeletal mesh component 的 transform 后,子 component 的 overlaps 会类似地更新
6162
### Movement Component
6263
scene component 以及它的子类已经实现了关键的 `MoveComponentImpl` 函数。movement component 则负责管理和按照一些规则更新 scene component 的速度和加速度,并根据 scene component 的速度来调用 `MoveComponentImpl` 更新物体的位置。它的 `UpdatedComponent` 字段指定了需要管理的 scene component
6364
```c++

_posts/UE/Basic GamePlay/2025-06-11 Behaviour Tree in Unreal.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,8 @@ decorator 节点的几个回调
3333
* 假设有新的行为树资产 U2,则 U2 的实例不与 U 的实例共享节点,即使这些节点可能是同一类的 task
3434
### 内存
3535
TODO:解释 special memory 和 instance memory 的区别
36+
### 组件
37+
AI Controller 首次运行行为树时,会创建 `UBlackboardComponent``UBehaviorTreeComponent`
38+
39+
`UBehaviorTreeComponent` 里可能运行的不止一个行为树,因为可以通过 run behavior tree 这个 task 节点嵌套新的行为树进来运行,因此 `UBehaviorTreeComponent` 中维护了一个 `InstanceStack` 来表示当前活跃的行为树实例
3640

_posts/UE/Basic GamePlay/2025-06-12 AI Perception in Unreal.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,24 @@ UAIPerceptionSystem
88

99
[Should I use “Pawn Sensing or “Ai Perception” for Unreal Engine 5.1.1?](https://forums.unrealengine.com/t/should-i-use-pawn-sensing-or-ai-perception-for-unreal-engine-5-1-1/791984) 中谈到 `UPawnSensingComponent` 被 AI Perception 取代了
1010

11-
[Unreal Engine AI with Behavior Trees](https://www.youtube.com/watch?v=iY1jnFvHgbE) 中讨论了 EQS 如何让 AI 变得更智能一些
11+
[Unreal Engine AI with Behavior Trees](https://www.youtube.com/watch?v=iY1jnFvHgbE) 中讨论了 EQS 如何让 AI 变得更智能一些
12+
### Sense, Stimuli and Listener
13+
stimuli 是 sense 观测的对象,AI Perception System 的 `RegisteredStimuliSources` 字段记录了哪些 actor 是 stimuli,并且这个 stimuli 能被哪些 sense 观测到
14+
15+
接收 sense 得到的 stimuli 更新数据的 AI Perception Component 又被称为 listener,场景中的 listener 都存放在 AI Perception System 的 `ListenerContainer`
16+
17+
具体负责观测 stimuli 并通知 listener 的对象被称为 sense,这些 sense 都继承自 `UAISense` 类。例如通过视觉观察 stimuli 的 `UAISense_Sight`,激活的 sense(至少存在一个 listener 对该 sense 感兴趣)都保存在 AI Perception System 的 `Senses`
18+
19+
在每一帧 tick 中,sense 根据的注册到自己这边的 listener 和 stimuli,依次判断每个 listener 能否观测到每个 stimuli。如果可以,发送新的 stimuli 信息给 listener,这些待 listener 处理的 stimuli 存放在 AI Perception Component 的 `StimulusToProcess` 字段中
20+
21+
在 listener 的每一帧 tick 中,对新来的 stimuli 进行处理。stimuli 包含了 actor 和具体的 stimuli 信息,listener 的 `PerceptualData` 中存储了 actor 与具体的 stimuli 信息的对应,然后根据新来的 stimuli 对 actor 对应的 stimuli 信息进行更新
22+
23+
当一个 actor 从可以被 listener 观测到变为不可被 listener 观测到,或者说 actor 从不可被观测到变为可观测到,那么会触发回调 `OnTargetPerceptionUpdated``OnTargetPerceptionInfoUpdated``OnPerceptionUpdated`。如果 `FAIStimulus``bSuccessfullySensed` 字段为 false,则说明 actor 从可观测到变为了不可观测,stimulus 包含的信息是最后一次观测到 actor 的信息
24+
### Stimuli Age
25+
在 sense config 中可以配置 listener 能保持对该类 sense 的记忆多久,如果全局设置 forget stale actors 为 true 并且超过 age 的时间 stimuli 没有被更新,那么 listener 会将 stimuli 信息从 `PerceptualData` 中删除,表现得好像从来没有 sense 到过该 actor 一样,并触发 `OnTargetPerceptionForgotten` 回调
26+
### Team
27+
可以通过 team 对 sense 这边需要检查的 listener - stimuli 对进行过滤。每个 listener 和 stimuli 对应的 actor 都实现 `IGenericTeamAgentInterface` 接口,实现自己的 attribute solver 并通过 `FGenericTeamId::SetAttitudeSolver` 进行注册。这样 sense 就会知道 listener 和 stimuli 的关系是 Friendly,Neutral,Hostile 中的哪一个。然后配置 sense config 中的 Detection by Affiliation 就能实现过滤了
28+
29+
因为通常 AI Perception Component 都是挂在 `AIController` 上,而 `AIController` 已经继承 `IGenericTeamAgentInterface` 了,所以 listener 这边的实现对 `AIController` 中的相应函数进行重载即可
30+
31+
默认情况下,所有的 listener 和 stimuli 的关系都是 `Neutral`
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
### SetFocus
2+
`AAIController::UpdateControlRotation`,保证 pawn 的 controll rotation 总是朝着 focal actor

_posts/UE/Small Goals.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ crazy game 上那个碰碰球游戏的复刻,加入本地双人,远程双人
6767
看的类型:rogue like,3D 平台,独立游戏?
6868
### RPG Notes
6969
TODO:拔剑混合的时候不好处理跳跃的情形
70+
TODO:处理 enemy 的转身滑步
71+
TODO:enemy 在攻击时也会 focus player,跟着 player 一起转,关了是不是好些
72+
TODO:修正 move to 即使没有靠近 player 也返回 true 的问题,见 [AI MoveTo always reports Success?](https://forums.unrealengine.com/t/ai-moveto-always-reports-success/478210)
73+
TODO:近战攻击的命中判定
74+
* 在命中帧给一个判定框:如果攻击动画比较慢的话容易给人一种延时感(就是击中了之后才触发受击动画)
75+
* 给武器一个 trigger box,在 overlap 时触发命中逻辑
7076
#### Combo
7177
巫师三里的 combo 触发判定比较松,核心是在角色挥击完上一剑后会有一段暂留时间,玩家可以选择要不要继续连击,**因此下一击衔接的时间是可变的,而不是一个固定的连击动画**
7278

_posts/UE/UMG and Slate/2024-11-12 UMG in Unreal.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
### Slate Brush
88
这个结构体来指定一个 UI 元素的外观。例如 button 就包含 normal,pressed,hovered,disabled 四个 slate brush 来指定各种状态下 button 的外观
99

10+
Draw As 字段用来控制如何绘制该 image,其中 box 和 border 是基于 [9-slice scaling](https://en.wikipedia.org/wiki/9-slice_scaling) 进行缩放的。margin 控制四个角上不进行缩放的 image 的占比,具体效果见 [WTF Is? Slate Brush in Unreal Engine 4](https://www.youtube.com/watch?v=kYxGC0WV0Uk) 中的实验
11+
1012
TODO:解释 slate brush 中各个字段的含义,以及它如何控制渲染效果
1113
### UPanelWidget and UPanelSlot
1214
`UPanelWidget` 的子类才有子节点,有 1 个还是多个子节点取决于 `bCanHaveMultipleChildren` 字段的值,在 `UPanelWidget` 的构造函数中默认为 true

0 commit comments

Comments
 (0)