1.UE入门笔记(1):编译UE4源码 + apk打包
2.UE4源码剖析——Actor蓝图之CDO与SCS
3.UE4源码剖析——异步与并行 中篇 之 Thread
4.[UE5.1] StateTree 使用与源码分析(二)
5.UE4学习笔记(1):UE源码下载编译+安卓打包
6.UE 八叉树Octree2源码分析
UE入门笔记(1):编译UE4源码 + apk打包
实验环境:win / VS专业版 / UE4..
准备工作①获取UE4源码:按照官方教程,源码完成邮件确认后即可下载 UE4..2源码。管理
记得下载Commit.gitdeps.xml文件,源码后续会用到。管理
②VS安装工具包:打开Visual Studio Installer,源码选中并安装
2、管理云南在线直播系统源码下载编译
下面操作均基于UE4源码文件夹
①执行bat文件
a)运行setup.bat,源码如出现下面错误,管理则需要替换Commit.gitdeps.xml文件
b)运行GenerateProjectFiles.bat,源码如出现下面错误,管理则将文件路径改短
②编译
打开UE4.sln,源码右键UE4选“生成”,管理编译过程多分钟
③UE4,源码启动!管理
编译完成后,源码打开Engine\Binaries\Win,找到UE4Editor.exe,即可启动。
3、安卓环境配置
下载Android Studio并在UE4部署安卓:参考官方教程以及UE部署到Android以及杂症的解决,配置过程较为复杂,一步步来不要跳步。
4、打包并测试
打包过程报错:
①packagingresults: error: failed to build "uattempproj.proj"
解决:打开项目.sln,重新生成AutomationTool
②找不到dx文件
解决:打开C:\Users\Administrator\AppData\Local\Android\Sdk\build-tools,将或版本文件夹中的dx.bat 和 lib 文件夹中的 dx.jar 复制到 .0.0 版本文件夹的对应位置。(build-tools从版本之后把dx的方式去掉了,而UE需要这个,没有的话会发布失败)
手机测试报错:
①No Google Play Store Key
解决:UE项目设置->Android中勾选“将游戏数据打包至.apk中”,重新打包
参考链接
① UE部署到Android以及杂症的解决
② UE4学习笔记(1):UE源码下载编译+安卓打包
③ 油管教程《Unreal Engine 4..2 Packaging For Android | Unreal Engine 4..2 Export Android Project》
UE4源码剖析——Actor蓝图之CDO与SCS
在UE的日常使用中,蓝图(UBlueprint)是我们接触最多的资产类型。每个蓝图在创建时需要选择一个父类,这决定了蓝图的类型,比如Actor蓝图、Component蓝图、Widget蓝图、动作蓝图等。以Actor蓝图为例,本文将深入探讨蓝图的基础架构,并学习如何通过代码读取蓝图资产在蓝图编辑器中的jedispool源码属性值。此外,本文还将重点介绍如何利用SCS框架管理新组件,并在运行时加载这些组件。
在实际开发中,我们经常需要对蓝图进行处理,例如在大型项目中,制定一套资源规范并开发一套资源检测工具。这些工具往往需要遍历特定目录下的蓝图并执行某些条件判断和处理。本文将帮助大家了解如何实现这些功能。
**实战需求**:
1. **例1**:要求所有放置在“Buildings”文件夹下的蓝图必须包含`StaticMeshComponent`组件,且`StaticMesh`字段不能为空。
2. **例2**:要求“Cars”文件夹下的所有蓝图的`SceneComponent`组件移动性必需为`Movable`。
**蓝图的父类与Actor蓝图**:
1. **蓝图的父类**:创建蓝图时,编辑器面板中选择的父类决定蓝图的类型,例如`TestActorChild2`的父类为`TestActorChild1`,而`TestActorChild1`的父类为`TestBlueprintActor`。
2. **Actor蓝图**:若蓝图的父类层级链最顶层是`Actor 类`,则该蓝图为`Actor蓝图`。
**蓝图产生类**:蓝图的`_C`后缀代表蓝图产生类,它用于在编译时生成C++类,包含蓝图中的信息。
**蓝图类(UBlueprint)**:加载蓝图包时,通过`LoadObject`函数获取到的是`UBlueprint`类。
**蓝图骨骼类(SkeletonGeneratedClass)**:以`SKEL_`前缀和`_C`后缀加载,表示蓝图的基础信息,通常在编辑器中修改时会重新生成。
**蓝图产生类(GeneratedClass)**:仅以`_C`为后缀加载,用于在运行时创建蓝图对象。
**前后缀声明**:`UBlueprint.h`中的`GetBlueprintClassNames`函数定义了这些前缀。
**Actor蓝图产生类的实例化与阶段拆分**:
1. **CDO的构建**:`ClassDefaultObject`是每个类的默认对象,用于提供默认属性值和行为。
2. **SCS组件附加**:通过蓝图编辑器的组件面板添加组件,这些组件存储在`SimpleConstructionScript`中,用于在运行时添加组件。
**CDO与SCS**:
- **CDO**:存储默认属性值与行为,节省数据传输和存储,支持配置化。
- **SCS**:简化组件添加过程,通过蓝图编辑器直观操作组件。wss 源码
**需求回顾与实现**:通过遍历CDO和SCS,判断组件属性值,实现特定条件的检测,如`StaticMeshComponent`的`StaticMesh`字段是否为空。
本文从实际需求出发,全面介绍了蓝图的基本概念、内部分类、构建流程以及如何利用SCS管理组件。希望本文内容能帮助开发者更深入地理解蓝图的工作原理,提高资源管理与组件处理的效率。
UE4源码剖析——异步与并行 中篇 之 Thread
我们知道UE中的异步框架分为TaskGraph与Thread两种,上篇教程我们学习了TaskGraph,它擅长处理有依赖关系的短任务;本篇教程我们将学习Thread,它与TaskGraph相反,它更擅长于处理长任务。而下一篇文章,我们则会承接Thread,去学习一下引擎中一些重要的线程。
Thread擅长处理长任务,从长任务生命周期这个层面来看,我们可以先把长任务分为两类:常驻型长任务与非常驻型长任务。
常驻型长任务侧重于并行,通常用于监听式服务,例如网络传输,使用单独的线程对网络进行监听,每当有网络数据包到达时,线程接收并处理后,不会立即结束,而是重置部分状态,继续监听,等待下一轮数据包。
非常驻型长任务侧重于异步,通常用于数据处理,例如主线程为了提高性能,避免卡顿,会将一些重负载的运算任务分发给分线程处理,可能分批给多条分线程,主线程继续运行其他逻辑。任务处理完成后,radiogroup源码将结果返回给主线程,分线程可销毁。
接下来,我们通过两个例子学习Thread的使用。
计算由N到M(N和M为大数字)所有数字的和。使用Thread异步调用,将计算操作交由分线程执行,计算完成后再通知主线程结果,代码实现如下:
逻辑分为两部分:启动分线程计算数字和,使用Async函数,参数为EAsyncExecution::Thread,创建新线程执行。学习Async函数用法,该函数返回TFuture对象,代表未来状态,当前无法获取结果,但在未来某个时刻状态变为Ready,此时可通过TFuture获取结果。
主线程注册回调,等待分线程计算完成,使用TFuture的Then函数,完成时触发注册的回调,也可使用Wait系列函数等待计算完成。
接下来学习常驻型任务使用。
定义玩家血量上限点,当前点,当血量未满时,每0.2秒恢复1点血量。代码实现分为创建生命治疗仪FRunnable对象、重写Run函数、创建FRunnableThread线程、测试恢复功能和释放线程资源。
生命治疗仪创建与测试完整代码如下,可验证生命恢复功能和暂停与恢复。
UE4中的FRunnable与FRunnableThread提供创建常驻型任务所需接口。无论是常驻型还是非常驻型,底层实现相同,都是使用FRunnableThread线程。
FRunnableThread线程结构包含标识符、abjb 源码逻辑功能、效率与性能、辅助调试字段。线程创建与生命周期分为创建FRunnable类对象、创建FRunnableThread对象两步,通过FRunnable的生命周期管理实现线程运行与停止。
UE4线程管理流程包括继承并创建FRunnable类对象、创建FRunnableThread对象,生命治疗仪线程创建代码。
UE4中的几种异步方式底层使用线程实现,学习了线程类型、创建、生命周期、销毁方法,为下篇学习引擎特殊线程打下基础。
[UE5.1] StateTree 使用与源码分析(二)
深入探讨UE5.1中的StateTree,从初始化到Tick更新数据的流程,以及其背后的源码分析。
一、StateTree的初始化流程:
1.1、筛选未激活的Entity:UMassStateTreeActivationProcessor执行初始化时,首先会筛选出所有没有打上FMassStateTreeActivatedTag标记的Entity。
1.2、遍历并创建上下文:接着,对这些Entity进行遍历,检查StateTreeInstanceList中是否已存在相应的StateTreeInstance。若不存在,则创建FMassStateTreeExecutionContext上下文。
1.3、注入Fragment:将状态树所需Fragment注入,并进行验证。
1.4、启动状态树:通过FMassStateTreeExecutionContext的Start()函数正式开始状态树的运行。
1.5、初始化数据与确定ActivateStates:在FStateTreeExecutionContext::Start()函数中初始化数据,并确定ActivateStates数组,这代表从根节点到激活状态的所有状态。
1.6、检查所有State的Conditions:遍历所有State,检查其条件,若有子节点,则递归检查。
1.7、完成初始化:回到UMassStateTreeActivationProcessor,为已初始化的Entity打上Tag,完成整个初始化过程。
二、状态树的Tick更新:
2.1、获取并判断状态:FStateTreeExecutionContext::Tick()作为外部调用刷新状态树的接口,首先获取当前正在运行的State,并判断整个树是否仍在运行。
2.2、刷新Evaluators:刷新所有State的Evaluators。
2.3、刷新并处理Tasks:刷新ActiveStates中的所有State任务,重点关注TickStatus的逻辑。一旦出现返回EStateTreeRunStatus::Failed的Task,整个Tick结果将失败。如果所有Task中存在非EStateTreeRunStatus::Running状态,则根据状态返回结果。若所有Task都在EStateTreeRunStatus::Running状态中,则Tick结果为Running。
2.4、处理状态完成与切换:如果最终Tick结果不是EStateTreeRunStatus::Running,则执行StateCompleted()函数,调用所有相关Task的StateCompleted函数。同时,检查当前State的所有Transitions,根据设置触发状态切换。
三、使用技巧与注意事项:
3.1、Task的InstanceData可以共享给整个State,根据Category设置决定。
3.2、设置为Output的参数可被外部使用,Task的Output参数仅限当前State内部共享。
3.3、Input参数的右值可引用当前State中的其他Task或Evaluator的Output参数,实现灵活的数据共享。
3.4、Task的执行顺序决定了Output参数的使用时机,确保Task的顺序正确。
UE4学习笔记(1):UE源码下载编译+安卓打包
注:该笔记以UE4..2在windows平台为例,vs版本为
1.关联github和Epic账户
要在github上获取UE4源码需要先关联账户,否则找不到源码,网页
按照官网提供流程即可完成 GitHub上的虚幻引擎 - Unreal Engine
记得确认邮件,否则还是(当初就是忘记了,卡了好一会儿)
2.下载UE4源码
在 Releases · EpicGames/UnrealEngine (github.com)中选择自己需要的版本(我使用的是4..2),这步很简单,但需要注意的是还需要将Commit.gitdeps.xml文件也一并下载,用于替换同名文件(有些版本则没有这样的文件),不替换的话后续会报错(之后步骤中会提到)
解压后目录如下:
3.执行bat文件
(1)点击运行setup.bat,没有替换Commit.gitdeps.xml文件可能会出现如下问题:
(2)点击运行GenerateProjectFiles.bat,此过程可能会出现如下问题:
未找到框架 .NETFramework Version=v4.6.2
只需要在VS Installer中选中安装就行:
完成后会生成UE4.sln文件
4.生成
VS打开UE4.sln,开始生成:
但是生成过程中我出现了这样的问题:
UE4 fatal error C: 编译器限制: 达到内部堆限制
error C: 超过了 PCH 的虚拟内存范围问题解决
我出现这样问题的原因是我的C盘空间不够大(分区的时候给的比较少),托管系统设置在C盘,导致无法分配足够的虚拟内存,设置为空间足够的盘即可。
步骤:电脑->属性->高级系统设置->高级->性能设置->高级->更改
OK,成功编译完成
5.安卓打包
该过程有官方文档,并且比较繁琐,直接给出链接:
设置虚幻的Android SDK和NDK | 虚幻引擎文档 (unrealengine.com)
UE部署到Android以及杂症的解决 - 知乎 (zhihu.com)
我就提一下自己遇到的问题,在UE4中进行安卓打包的时候遇到了这样的问题:
原因在于SetupAndroid.bat中,SDK Platform的版本选择是,而在UE项目设置->平台 - Android SDK中的SDK API Levle默认选择latest。但是我安装AS的时候默认给我安装了最新的Android API (此时latest指向的是版本),导致冲突。解决方法是UE项目设置中手动设置指定版本,或者在AS中卸载高于版本的Android API。
OK,打包成功!!!
6.打开游戏
但是,是的,还有但是(都最后一步了,还有问题OVO!!!),在手机上下载安装,打开后是这样的:
原来是因为打包除了生成apk文件还生成了obb,至于Google Play Store Key应该就是一个密钥了。
解决方法是在UE项目设置->Android中勾选“将游戏数据打包至.apk中”,我们可以看到对这个勾选项的解释:
行,勾选后重新打包,成功运行:
UE 八叉树Octree2源码分析
UE中八叉树Octree2源码分析,本文旨在深入理解UE八叉树的具体实现。八叉树概念广泛熟悉,但初次接触UE实现时仍需思考。UE八叉树简化应用,多数直接使用方便。本文针对UE4.至UE5.1版本八叉树源码进行详细解析。
UE八叉树主要结构包括:TreeNodes、ParentLinks、TreeElements、FreeList、RootNodeContext和MinLeafExtent。TreeNodes存储节点信息,每个FNode记录当前节点元素数量及子节点Index;ParentLinks记录节点父节点ID;TreeElements存储元素数据;FreeList记录空闲FNode下标;RootNodeContext和MinLeafExtent与八叉树构造相关,用于确定节点半径。
UE八叉树构造过程依赖AddElement方法,实现在AddElementInternal中。首先判断节点是否为叶子节点。若无子节点且元素数量超过预设阈值,或节点半径小于MinLeafExtent,则创建子节点。否则,直接将元素加入当前节点。若需创建子节点,清空当前节点元素,分配八个子节点,递归处理非叶节点情况。
RemoveElement方法根据ElementId移除元素。首先在TreeElements中移除元素,然后从节点向上遍历,检查元素数量过少的节点,进行塌缩重构,将子节点元素移入当前节点。
UE八叉树查询接口包括FindElement、FindElementsWithBoundsTest等,核心目的是遍历节点和子节点以满足查询条件。UE八叉树用于高效空间数据处理,通过Octree2类声明实现。例如,PrecomputedLightVolume类定义ElementType和OctreeSemantics,便于特定应用使用。
UE八叉树内存管理关键在于TreeElement数组,使用TInlineAllocator或FDefaultAllocator需考虑应用场景。空间数据结构如四叉树、八叉树等在空间划分算法中具有重要应用,优化碰撞检测及实现复杂场景。
UE5 源码结构解读——Unreal Engine 5文件系统详细导览
欢迎加入“虚幻之核:UE5源码全解”,探索Unreal Engine 5(UE5)的深层秘密。作为一款行业领先的游戏引擎,UE5不仅集成了Nanite虚拟化微多边形几何系统和Lumen动态全局光照等革新技术,还提供了一个深度解析专栏,帮助开发者、图形程序员和技术艺术家从源码级别理解其核心构造。
UE5不仅仅是一个游戏引擎,它代表了虚幻技术的巅峰,赋予了创造创新视觉和互动体验的无限可能。我们的专栏将深入探讨这些技术背后的源代码,揭示它们的工作原理,并展示如何在您的项目中实现和优化它们。
每一期专栏都是一个精心设计的知识模块,旨在让读者不仅掌握UE5的功能,更从源码层面掌握其实现细节。从资产流水线到渲染过程,从物理模拟到AI行为树,无论您希望优化当前项目性能,还是探索UE5隐藏的功能和技巧,这里都将为您提供宝贵的资源。
“虚幻之核:UE5源码全解”是您探索虚幻引擎深层秘密的起点,让我们用源码解答虚幻世界中的奥秘。
UE动画优化之URO(UpdateRateOptimizations)源码解析
1. URO技术是Unreal Engine动画优化的重要组成部分,它通过智能调整远离摄像头的对象的动画帧率,实现了动画质量和性能的平衡。
2. 在UE中,URO与LOD和VisibilityBasedAnimTick协同工作,核心动画处理主要在USkeletalMeshComponent的TickComponent和TickPose中执行。
3. FAnimUpdateRateManager负责指挥整个动画更新频率的调整过程,根据对象距离、LOD等因素动态地进行优化,确保每一帧的动画都既流畅又经济。
4. USkinnedMeshComponent通过TickUpdateRate和FAnimUpdateRateManager的配合,实现了URO的效果。开发者可以通过SetTrailMode和SetLookAheadMode等函数,对动画参数进行精细调整,使角色动作既自然又节能。
5. 要掌握URO,关键在于四个策略:命令行魔法、距离阈值决定论、LOD定制策略和插值选项。这些策略可以通过CVarEnableAnimRateOptimization、CVarForceAnimRate、MaxDistanceFactor、LODToFrameSkipMap等参数进行调整。
6. SkeletalMesh组件提供了VisibilityBasedAnimTickOption设置,以实现不同状态下的动画表现一致性。
7. 使用DisplayDebugUpdateRateOptimizations,开发者可以可视化URO的运行情况,帮助精准调整优化策略,提升游戏性能。
8. 通过细致的设置,URO就像一位精密的调音师,为游戏世界赋予了动态且高效的动画生命。