虚幻引擎是个十分庞大且复杂的游戏引擎,想要掌握的话需要不断地学习和锻炼,那么如何从一个小白逐渐变成高手甚至将来成为业界的翘楚(我显然不是)呢,笔者将根据目前自身目前的学习方法和计划以及其他学长的指导和UE论坛等回答进行一个系统的总结和规划,希望能够帮助大家成为一个真正的虚幻大佬,嘿嘿嘿。
新手小白-初识引擎-虚幻引擎是啥子
1.学习引擎的编辑器使用
了解基础界面,应用设置,怎么在地图上摆放物体等基本操作
2.学习蓝图
3.学习引擎的各个功能模块:动画,AI,材质,UMG,网络,粒子等
4.学习配置下载插件
5.能力标志:做一个独立的小游戏(仅用蓝图还是比较容易达成的)
核心骨干-掌握引擎-原来虚幻引擎底层这么复杂
1.游戏里的一些模块可以用c++开始实现,例如函数库里实现计算逻辑
2.对一些特定模块可以开始用c++编写,战斗逻辑,AI
3.思考c++和蓝图如何更好结合的程序框架
4.开始收集整理一些常见的c++函数库
5.开始学会创建自己的插件
6.明确自己的专攻方向(只讨论程序)
AI,战斗逻辑,UI,动画等等
能力标志:c++和蓝图哪个方便使用(知道什么时候用蓝图什么时候用c++)
成为高手-懂得引擎-虚幻引擎也不过如此嘛
1.开始研究和理解引擎里模块的机制和原理
2.发现c++中一些不足之处和缺少的功能开始自己写支撑类和功能
3.发现并修复引擎中的bug
能力标志:对引擎的模块,都有信心可以找到源码并分析和扩展遗漏的功能,知道我想要哪个功能,我就能在对应的模块找到我想要的源码
通天代-超越引擎-UE已经是我的形状了
1.可以重写某个引擎的模块,做的甚至比引擎的作者还要更好
2.负责优化引擎来适配自己的项目
3.改造引擎的一部分,改造开发配套流程,有机高效融合进自己的工作流程
能力标志:将UE玩弄于股掌之间,看到全盘的结构,引擎只是我们项目的工具
成为行业的领航人物-创造引擎-原来被叫大佬是这种感觉
1.对引擎的整体结构了如指掌
2.可以站在整个引擎行业的高度创造更高生产力的工具
能力标志:没有参考
好了,说了这么多,我们现在就重点从c++的角度来给大家讲合理的学习路线,打开虚幻引擎的大门,走入真正的UE世界
1.什么是虚幻c++
扎实的标准c++基础能力
采用c++编写游戏逻辑
适用虚幻引擎底层的c++框架
-
Module配置和插件使用
-
UBT和UHT
-
掌握Core模块的c++库:FString,TArray,UE_LOG
-
熟练掌握CoreUObject:宏,GC,序列化
-
熟悉c++和BP的交互
2.怎么判断我已经掌握了UEC++
-
懂得解决各种编译链接错误,常常是因为Module出错
-
懂得常见的编写套路:CreateDefaultSubObject,UPROPERTY
-
理解UObject的内存管理机制,不会造成内存崩溃
-
可以在源码里面找到自己想要的代码块
3.为什么要用c++开发UE的GamePlay,为啥不像unity一样用c#呢
-
性能
-
高端,将你主机里面的性能发挥到极致,这就是为什么UE适合做黑神话之类的3A大作
-
更底层,可以优化项目
-
可以做更大的项目,更方便管理
-
更加开放,具有灵活的定制性,可以直接修改源码
-
更容易迭代,不需要时时更新接口层
-
c++更复杂,更容易折磨程序员(bushi),c++上限非常高
4.只用蓝图不香吗,为什么要用c++呢
-
方便拓展功能,直达引擎的底层结构
-
更好的性能,性能优化
-
方便调试引擎,更容易dBug
-
蓝图都是别人做好的,用c++可以做自己想要的东西,可能别人没做蓝图的某个部分你这个方法就用不了了
-
可以实现定制化的需求,且便于理解别人的插件的底层原理,大项目的话仅仅使用蓝图会非常复杂,难以管理
5.什么时候开始学习c++比较合适
-
先把蓝图学明白
-
熟悉引擎GamePlay框架概念,GameMode,ControlRig等等
-
学会引擎的各模块功能,动画蓝图,AI,UMG,怎么骨骼绑定,怎么使用BlackBroad,行为树,组件,接口这些基础不能再基础的知识
6.So,你怎么判断自己蓝图有没有彻底学会呢
-
蓝图太容易了,所以会被很多人忽视
-
了解Actor,Pawn,Character之间是什么关系,是什么时候用接口,蓝图通信是什么,数据表怎么用,事件分发器是啥玩意,是什么时候自己创建组件,碰撞Overlap,Block有什么区别,怎么自己建通道检测,Niagara,还有什么常见的函数怎么使用,lerp,Interp,TimeLine,Sequence,flip flop这些,随便写了些
-
当你用蓝图能做个很好的项目的时候,你差不多就已经掌握了
7.虚幻c++需要学习哪些内容(重点)
-
Core:虚幻c++文件夹里就有一个文件夹叫Core,包含了一些底层的c++源码
-
GamePlay
-
Module-UBT-c#
-
反射-UHT
-
CoreUObject-GC
-
常见套路,我这个玩法通常怎么写,这个模块通常怎么写,跟你数学题相似的题型套公式一样
下面我们来详细讲一下(写累死我了,开把王者先)
1.Core
-
一定一定要把c++基础打牢,这非常重要,建议先学c++
-
学到需要看懂以下内容:
-
TArray(数组),TSet(集合),TMap(映射)等各种容器
-
FString,FName,FText的操作互换
-
TSharedPtr,TSharedRef,TWeakPtr等各种智能指针
-
理解Delegate,TAttribute,TSubClassOf的机制和用法
-
多看看设计模式,这样能用好FRunnable等多线程同步
-
好多好多宏,知道是啥
其实c++学完STL后就已经可以跟着UEC++两者共同学习了
2.GamePlay
-
Actor的创建,组装Component,BeginPlay,Tick,构造函数,事件绑定这些(都是套路,写来写去都是这些思路)
-
引擎GamePlay对象的继承组织使用
-
UObject自定义对象的组织管理
-
引擎数据对象的使用:Config,DateTable
-
功能模块的c++层级编写(UMG,AI,动画)注意有机结合
这部分代码在GameFramework(在Engine文件夹下面的一个叫这个名字的文件夹里面)
3.Module-UBT-c#
-
学会去链接模块,项目和插件可包含多个模块
-
UBT调用UHT生成代码,然后调用MSBuild编译代码
-
Build.cs是重点
UBT会使用c#收集.cs文件调用UHT来处理.h头文件或者是什么宏之类的,没错,UE也会用c#,具体的方法,本文不是讲解就不再赘述
ModuleRules.cs-模块链接
-
PublicDependencyModuleNames
public链接的模块名称,最常用
在自己的public和private里面包含对方的public
-
PrivateDependencyModuleNames
private链接的模块名称,只引用不暴露
在private里包含对方的public,不扩充自己的public
-
DynamicallyLoadedModuleNames
动态链接的模块名称,在runtime被ModuleManager加载,保证先编译
举个例子:
在你的Game文件夹的.build.cs中
- using UnrealBuildTool;
-
- public class FPSWithCPP : ModuleRules
- {
- public FPSWithCPP(ReadOnlyTargetRules Target) : base(Target)
- {
- PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
- PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput" ,"Niagara" ,"AIModule","NavigationSystem","GameplayTasks","UMG"});
- }
- }
一个模块下面通常有public和private文件
你用的模块想给别人用通常用public
然后在头文件中#include你加进去的模块,类似#include"GameFramework/SpringArmComponent.h"
4.反射-UHT
-
理解.generate.h和gen.cpp
-
理解MODULENAME_API的含义,常见的犯错地方
-
掌握宏的反射和用法
UCLASS
USTRUCT UENUM UPROPERTY UFUNCTION UINTERFACE GENERATED_BODY()
-
理解类型和对象的关系 object reference和class reference
-
理解UClass,UScriptStruct,UField,UFunction
-
通过反射遍历对象函数
5.CoreUObject-GC
-
GC-垃圾回收
-
CDO:理解类型和对象实例化,模板
1.理解classDefaults作为模板的作用
2.理解CDO在序列化中的意义作用
-
Package:理解对象的相互组织方式
1.对象可以包含子对象
2.序列化时,把一系列对象用一个对象包起来,这个对象叫包
3.package也可以互相引用
6.常见套路
套路一
-
UHT的套路:宏
-
模块连接的套路:几个常用属性.AddRange
-
Actor创建的套路:
ConstructorHelpers
CreateDefaultSubobject
SetupAttachment
-
GamePlay继承的套路
尽量不要在蓝图里面写逻辑
想要结构良好,尽量遵循引擎结构
GI,GM,GS,PC,Pawn,PS,继承(GameInstance,GameMode,GameState,PlayerControl)
遵循推荐结构,会发现支持拓展和支持联机
套路2
c++BP交互的套路:
-
UPROPERTY,UFUNCTION
-
C++定义基类写逻辑,蓝图继承配置可视化是种易扩展高性能的方法
-
函数库是个好东西
事件绑定的套路:
-
DELEGATE,MULTICAST_DELEGATE,EVENT,DYNAMIC
-
input:BindAxis,BindAction
-
Collision:Hit,Overlap,AddDynamic
-
Slate&UMG Event:SLATE_EVENT(FOnClicked,OnClicked)
-
FTimerManager
引擎常用方法的套路
-
Engine/class/Kismet有好多库
-
Gameplaystatics很常用,可以访问GamePlay的很多对象
-
UKismetSystemLibrary,系统目录等功能,LineTrace
-
UKismetMathLibrary,数学
8.学习虚幻c++有哪些难点呢
-
C++基础太弱
-
数据结构,操作系统这些没学明白(学校里面的东西要好好学)
-
数学不行啊
-
装备库太少:渲染,动画,AI...(武功高手从来不只会一个武功)
-
没有项目开发经验,不知道如何去搭一个好的游戏框架
-
知识要点太多:一堆宏,API(别看我,我也记不住)
-
看代码能力不足,别人写的看不懂(emmm)
9.怎么学习虚幻c++呢
模仿
-
先模仿,模仿模版项目,比如第一人称项目,你自己写能不能写的和它一样
-
看别人写的项目和源码,但是写的质量可能参差不齐
-
上网看教程
自己动手改改试试(随便玩玩引擎)
-
自己改改一些地方观察变化
-
自己尝试着用套路写功能
总结规律
-
养成记学习笔记的好习惯
善于积累
-
可以弄个测试项目,用一个小场景测试想要的功能
-
将有用的代码块,通过插件函数库封装起来,能够在项目之间复用
-
对于概念可以画思维导图,理解关系和区别
-
尝试自己画流程图
自己尝试项目实践
9.不要对蓝图或c++有任何偏见!!!
不要听到有人说什么写蓝图根本不懂游戏开发,只会像个小孩子一样连连看,也有人说用c++那么麻烦,看的头都大,我想说的是两者都是工具,每个方法都有自己的优点和缺点,我们需要扬长避短,不是工具的错误。
但是有些东西其实根本不需要去学,UE你也学不完,所以确定一个方向是非常重要的,要有清晰的规划和学习路径。
10.蓝图和c++在实际游戏开发中的配比
-
偏向引擎底层,偏向性能,偏向稳定的,使用c++
-
偏向表现层,偏向经常操作,偏向多变的,使用蓝图
11.其他
-
用插件在项目之间共享代码
-
变量类型尽量偏向抽象基类,比如UStaticMeshComponent和UPrimitiveComponent
-
善用c++前置声明,减少对include依赖,加快编译
-
善用蓝图函数库
-
c++代码里面不要写数据配置,尝试数据驱动,C++->BP->DataTable
-
c++定义基类,蓝图继承
-
没有C++基类的蓝图类,也可以reparent基类,用CoreRedirects修复
-
如果可以不改引擎,尽量不改
-
在改动的时候标上宏或者注释,以后merge方便
12.可能比较常见的概念
-
GEngine:
从GEngine可以开始获得Worlds,游戏播放和编辑的场景也是个World
获取游戏视口进行slate叠加或截图
-
GEditor
可以获得当前选择Actor等有用信息
可以获得当前视口
可以调用编辑器功能
可以获得事件回调
不想写了。。。关注笔者博客,笔者会不定时更新
13.源码剖析
-
时空观
时:注重时间上的先后,观察函数的调用流程,事件的触发时机,(这个实现的顺序是什么)
空:注重数据的吞吐转换,观察信息的采集,数据的加工消化利用(这个实现需要哪些数据,这些数据有什么用)
时空的交互,组成了有机的功能架构支撑,调度起资源,启动内循环,响应外部刺激
-
从开始到结束
一开始有哪些东西?开始的源头是什么?后续又是怎么继续实现的?这个模块向外传输了哪些数据?
-
比好奇心更重要的是保持耐心
有的时候常常迷惑这是干什么的
不理解这么做,有什么用意
调用的链条太长,自己脑子一下子记不住这么多东西
代码调来调去,不知所云.........
学习资源(个人推荐)
UE官方文档:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/unreal-engine-5-5-documentation
【2024 UE5.4虚幻C++游戏开发入门-哔哩哔哩】 https://b23.tv/dHmEt0a
油管上的,非常全面,包含常用套路:https://unrealcpp.com/
虚幻引擎国区总监,大佬中的大佬:https://www.zhihu.com/people/fjz13
【《UE4C++入门到精通合集》-哔哩哔哩】 https://b23.tv/JwiWJbu
讲了这么多,大家可能一听就有点望而却步,可是这也恰恰是学习的乐趣,就和你玩老头环一样,一开始手忙脚乱的,但是越到后面你的装备越好,你的技术不断提高,你也会逐渐感受到乐趣。最后送给大家一句话:披星戴月走过的路,终将会繁花满地,大家一起加油,我也会不断进步,ciallo~
评论记录:
回复评论: