1.UE入门笔记(1):编译UE4源码 + apk打包
2.UE 打包引擎源码
3.UE4源码剖析——Actor蓝图之CDO与SCS
4.UE动画优化之URO(UpdateRateOptimizations)源码解析
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》
UE 打包引擎源码
本文作为个人记录使用。
1. 获取引擎源码:在GitHub上下载对应版本源码(需订阅虚幻引擎并与你的虚拟引擎账号关联)。安装Microsoft Visual Studio,建议选择读写速度较快的硬盘,并预留足够空间。官方文档:docs.unrealengine.com/4...
unrealengine.com/zh-CN/...
运行setup.bat开始下载,可加参数加速下载(--threads=N表示用N个线程加速下载)。网速慢时,可能需要更长时间。resolv源码下载
完成下载后,运行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...
UE4源码剖析——Actor蓝图之CDO与SCS
在UE的日常使用中,蓝图(UBlueprint)是我们接触最多的资产类型。每个蓝图在创建时需要选择一个父类,这决定了蓝图的类型,比如Actor蓝图、Component蓝图、Widget蓝图、动作蓝图等。以Actor蓝图为例,hmily源码解析本文将深入探讨蓝图的基础架构,并学习如何通过代码读取蓝图资产在蓝图编辑器中的属性值。此外,本文还将重点介绍如何利用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**:存储默认属性值与行为,bootstarp商城源码节省数据传输和存储,支持配置化。
- **SCS**:简化组件添加过程,通过蓝图编辑器直观操作组件。
**需求回顾与实现**:通过遍历CDO和SCS,判断组件属性值,实现特定条件的检测,如`StaticMeshComponent`的`StaticMesh`字段是否为空。
本文从实际需求出发,全面介绍了蓝图的基本概念、内部分类、构建流程以及如何利用SCS管理组件。希望本文内容能帮助开发者更深入地理解蓝图的工作原理,提高资源管理与组件处理的效率。
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等参数进行调整。keil源码阅读
6. SkeletalMesh组件提供了VisibilityBasedAnimTickOption设置,以实现不同状态下的动画表现一致性。
7. 使用DisplayDebugUpdateRateOptimizations,开发者可以可视化URO的运行情况,帮助精准调整优化策略,提升游戏性能。
8. 通过细致的设置,URO就像一位精密的调音师,为游戏世界赋予了动态且高效的动画生命。
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.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的顺序正确。
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源码的学习路径,从动态网格到静态网格的转换、基础形状添加到输出类型对应函数,提供了一条完整的流程概述。
2024-12-22 15:10
2024-12-22 15:08
2024-12-22 14:55
2024-12-22 14:17
2024-12-22 13:44
2024-12-22 13:12