小项 | 备注 |
---|---|
时间 | 2020年2月22日 |
修改时间 | 2020年3月14日 |
城市 | 北京市房山区 |
天气 | 晴 |
心情 | 充实 |
2020年2月20日,虚幻社区经理大钊在B站进行了近三个小时的直播,其主题是【虚幻C++进阶之路】,首先向他致谢。
听完之后,我想输出一下,自己的一些感受和疑问,自问自答。
总体分为了五个部分,个人觉得最接地气,最具有干货的是第二部分,当然每一个部分都很重要,但是对于目前还是小白的我,可能第二部分对我来说,更有实用性。
一、
1. 虚幻引擎的学习之路
首先将每一个使用虚幻的人(无论是学习者还是工作者),分为了五个层次,而每一个层级都给与了一个能力标志,结合自己的能力,看看自己处于哪个阶段。
我的情况,可能比较特殊一点,没有经过蓝图,直接上了C++,所以现在处于一个跛脚的状态。如果非要给自己归一个阶段的话,我觉得是0.5吧,自己目前还不能独立开发一个小游戏。
2. 虚幻C++的进阶之路
这一部分,比较重要,通过5W1H去讲解,无论是对项目还是学习,都比较实用。那么我就说几个自己比较有触的点。
(1)为什么要用C++
C++的上下限很宽,这个域很广,是一种自我负责,而不是别人照顾,受制于人的语言。
(2)C系列语言之间的区别?
小项 | C语言 | C++ | C# |
---|---|---|---|
编译方面 |
(3)GamePlay框架
(4)Module—UBT—C#
C#在虚幻C++中是脚本配置文件 1. Include了哪些头文件 2. 链接的 DLL
(5)右键Build之后, 有哪些幕后工作
①UBT(C#编写)将项目的C#文件(Target.cs、Build.cs配置信息)收集起来,【判断哪些文件被修改】;
②调用UHT(C++编写)(文本解析工具,不是编译工具),根据UCLASS、等宏(所有的宏),生成Intermediate下的 generated.h;
③UHT将第二步生成的文件和Source文件夹下的文件,合在一起编译一下。
(6)模块引用与暴露
只认三个文件夹:classes、private、public
①上一级文件夹:以模块名字命名的文件夹;
②下一级文件夹:Sub文件夹,#include的时候需要写的。
Copy Full Path即可
(7)ModuleName_API是否写上
这个宏是为 DLL导出服务的。
(8)UPROPERTY垃圾回收
声明的变量被此宏罩住,才进行垃圾回收,否则不进行垃圾回收。
3. 虚幻C++的推荐项目实践
C++定义基类 + 蓝图继承
4. 虚幻C++核心概念
编辑器本身也是一个跑起来的Game
5. 虚幻引擎的源码剖析经验分享
这一部分主要是以大钊的个人经验来分享的。
二、
1. Demo的功能
(1)编辑器状态下,生成Actor
(2)调用模拟按钮功能
(3)保存模拟状态(UE本身的快捷键功能 【K】)
(4)在模拟状态下,生成Actor,并且可以保存状态
2. Myself Get的点
(1)项目.sln 切换版本
重新生成一下项目, 删除 Binaries 和 Intermediate 文件夹, 与 .sln ,然后运行 切换版本的 bat 文件,
如果不删除这些文件的情况下,直接运行 bat文件,项目运行的结果是引擎跑起来,让你重新新建一个项目,而不是这个项目跑起来。
(2)源码版引擎 与 启动版引擎
在VS中,解决方案配置,默认状态下是Development Editor,由此创建的游戏和引擎都是Release的,
将解决方案配置切换到Debug Editor下,创建的游戏和引擎都是Debug的
问题:在DebugEditor状态下,项目跑起来后,在资源浏览器中,添加C++类,之后又重新编译了引擎?这是因为什么?
(3)宏
①CallInEditor 在细节面板 产生一个按钮
UFUNCTION(CallInEditor, Cateory = Editor)
②编辑器情况下使用的代码,用宏包起来
#if WITH_EDITOR
函数的 声明 (.h) 与 定义 (.cpp)
#endif
#if WITH_EDITORONLY_DATA
属性的 声明
#endif
③自己定义的宏
普通C++的宏,不能用,因无法被UHT(只文本解析,无法编译)识别,不能宏展开
问题:在一些 xxxStyle.cpp中,有一些 #define GETDEFAULTFONT 巴拉巴拉 之类的宏?
④ .Build.cs 中如何判断呢? Target(TargetRules.cs文件中)
if (Target.bBuildEditor)
{
模块包含代码
}
(4)多种世界类型(在EngineTypes.h 中 EWorldType命名空间中)
从 根 上去获得,例如 根 GEditor、 根 GEngine
①Editor World
②PIE World
③Preview World(静态网格体编辑器中)
④。。。
(5)Cast 与 CastChecked
如果是 Cast ,则下面可以跟 一个 if (xxx != nullptr)
如果是 CastCheckout,是会抛出异常的,相当于 Check(Cast)
如何找到代码
①VS ctrl+F
②VA
③Widget Reflection,对于UI来说,注意 Execute【执行】这种敏感的字眼
④开Debug Editor ,调用堆栈
⑤ 注意日志消息 (1)输出日志 (2)右下角 (3)消息日志
例如,在PIE状态下,选中Actor,按 k 键 即可保存状态,就会弹出消息日志。
鸡贼 C V
缺啥补啥,哪里报错,解决哪里
如果找不到接口在哪里,就直接把对应的代码块,直接粘贴过来,感觉有用的,或不确定的,保留,没用的 删掉。
注意输入与输出,喂给足够的数据。
如果找到的类在 Private文件夹下,改怎么办?
- 可通过Uproperty反射,因为对象一般有这个宏,才支持GC
- 就算没有,也可通过对象池中,通过类型(FindObject)找到