1.UE5 源码结构解读——Unreal Engine 5文件系统详细导览
2.UE 八叉树Octree2源码分析
3.[UE5.1] StateTree 使用与源码分析(二)
4.UE5 ModelingMode & GeometryScript源码学习(一)
5.UE4学习笔记(1):UE源码下载编译+安卓打包
6.UE 打包引擎源码
UE5 源码结构解读——Unreal Engine 5文件系统详细导览
欢迎加入“虚幻之核:UE5源码全解”,源码探索Unreal Engine 5(UE5)的系列深层秘密。作为一款行业领先的源码游戏引擎,UE5不仅集成了Nanite虚拟化微多边形几何系统和Lumen动态全局光照等革新技术,系列还提供了一个深度解析专栏,源码帮助开发者、系列仿mooc网源码图形程序员和技术艺术家从源码级别理解其核心构造。源码
UE5不仅仅是系列一个游戏引擎,它代表了虚幻技术的源码巅峰,赋予了创造创新视觉和互动体验的系列无限可能。我们的源码专栏将深入探讨这些技术背后的源代码,揭示它们的系列工作原理,并展示如何在您的源码项目中实现和优化它们。
每一期专栏都是系列一个精心设计的知识模块,旨在让读者不仅掌握UE5的源码功能,更从源码层面掌握其实现细节。从资产流水线到渲染过程,从物理模拟到AI行为树,无论您希望优化当前项目性能,还是探索UE5隐藏的功能和技巧,这里都将为您提供宝贵的资源。
“虚幻之核:UE5源码全解”是您探索虚幻引擎深层秘密的起点,让我们用源码解答虚幻世界中的奥秘。
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.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,完成整个初始化过程。api收录源码
二、状态树的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参数,实现灵活的pipe游戏源码数据共享。
3.4、Task的执行顺序决定了Output参数的使用时机,确保Task的顺序正确。
UE5 ModelingMode & GeometryScript源码学习(一)
前言
ModelingMode是虚幻引擎5.0后的新增功能,用于直接在引擎中进行3D建模,无需外接工具,实现快速原型设计和特定需求的模型创建。GeometryScript是用于通过编程方式创建和操控3D几何体的系统,支持蓝图或Python脚本,提供灵活控制能力。
本文主要围绕ModelingMode与GeometryScript源码学习展开,涵盖DMC简介、查找感兴趣功能源码、动态网格到静态网格的代码介绍。
起因
在虚幻4中,通过RuntimeMeshComponent或ProceduralMeshComponent组件实现简单模型的程序化生成。动态网格组件(DynamicMeshComponent)在UE5中提供了额外功能,如三角面级别处理、转换为StaticMesh/Volume、烘焙贴图和编辑UV等。
将动态网格对象转换为静态网格对象时,发现官方文档对DMC与PMC对比信息不直接涉及此转换。通过搜索发现,DynamicMesh对象转换为StaticMesh对象的代码位于Source/Runtime/MeshConversion目录下的UE::Modeling::CreateMeshObject函数中。
在UE::Modeling::CreateMeshObject函数内,使用UEditorModelingObjectsCreationAPI对象进行动态网格到静态网格的转换,通过HasMoveVariants()函数接受右值引用参数。UEditorModelingObjectsCreationAPI::CreateMeshObject函数进一步处理转换参数,UE::Modeling::CreateStaticMeshAsset函数负责创建完整的静态网格资产。
总结转换流程,DynamicMesh对象首先收集世界、变换、资产名称和材质信息,通过FCreateMeshObjectParams对象传递给UE::Modeling::CreateMeshObject函数,该函数调用UE::Modeling::CreateStaticMeshAsset函数创建静态网格资产。
转换为静态网格后,程序创建了一个静态网格Actor和组件。此过程涉及静态网格属性设置,最终返回FCreateMeshObjectResult对象表示转换成功。
转换静态网格为Volume、动态网格同样在相关函数中实现。
在Modeling Mode中添加基础形状涉及UInteractiveToolManager::DeactivateToolInternal函数,当接受基础形状时,调用UAddPrimitiveTool::GenerateAsset函数,根据面板选择的输出类型创建模型。
最后,UAddPrimitiveTool::Setup函数创建PreviewMesh对象,UAddPrimitiveTool::UpdatePreviewMesh()函数中通过UAddPrimitiveTool::GenerateMesh生成网格数据填充FDynamicMesh3对象,进而更新到PreviewMesh中。
文章总结了Modeling Mode与GeometryScript源码的学习路径,从动态网格到静态网格的转换、基础形状添加到输出类型对应函数,提供了一条完整的流程概述。
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 打包引擎源码
本文作为个人记录使用。
1. 获取引擎源码:在GitHub上下载对应版本源码(需订阅虚幻引擎并与你的虚拟引擎账号关联)。安装Microsoft Visual Studio,建议选择读写速度较快的硬盘,并预留足够空间。官方文档:docs.unrealengine.com/4...
unrealengine.com/zh-CN/...
运行setup.bat开始下载,可加参数加速下载(--threads=N表示用N个线程加速下载)。网速慢时,可能需要更长时间。
完成下载后,运行GenerateProjectFiles.bat生成解决方案。
2. 构建源码:编译源码时,可适当修改源码hh。具体操作可参考官方文档:docs.unrealengine.com/4...
记得先Build AutomationTool。
我下载了Windows SDK:developer.microsoft.com...(VS中的可能还不够,猜测)。
再次Build时,遇到一个问题:
我采取的有效方法:在HoloLensTargetPlatform.Build.cs中添加了一行参数bEnableUndefinedIdentifierWarnings = false;
3. 开始打包:通过cmd执行RunUAT.bat,等待打包完成。顺利的话,将在/引擎目录/LocalBuilds/Engine下找到打包好的包。我的路径是:E:\UnrealEngine-4..2-release\Engine\Build\BatchFiles\RunUAT.bat,参数:BuildGraph -target="Make Installed Build Win" -script=Engine/Build/InstalledEngineBuild.xml -clean。
详细的脚本选项可参考官方文档:docs.unrealengine.com/4...
接下来就开踩。安装vs时遇到错误,后来发现不用下载,修改参数即可。我使用的是vs,不知道vs是否可行。
这种就是配置对应的环境。想必后面还有ERROR: Platform IOS is not a valid platform to build,我都学会抢答了(安装ios环境需要apple id,我没有)。
因为我并不需要打包其他平台,所以修改了参数,仅打包支持Window平台的BuildGraph -target="Make Installed Build Win" -script=Engine/Build/InstalledEngineBuild.xml -set:WithWin=true -set:WithWin=true -set:WithMac=false -set:WithAndroid=false -set:WithIOS=false -set:WithTVOS=false -set:WithLinux=false -set:WithLinuxAArch=false -set:WithLumin=false -set:WithLuminMac=false -set:WithHoloLens=false -set:WithClient=true -set:WithServer=true -set:VS=true -clean。
打包成功提示succeed。
其他:blog.csdn.net/qq_... store.algosyntax.com/tu... UE4使用BuildGraph构建二进制版本虚幻引擎 docs.unrealengine.com/4... Android SDK的下载与安装 cnblogs.com/KisonDu/p/1... iOS和tvOS开发要求 打包插件必须安装vs ? github.com/EpicGames/Un...
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就像一位精密的调音师,为游戏世界赋予了动态且高效的动画生命。
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》