Unreal 虚幻C++进阶之路—致敬大钊

2020-02-22  本文已影响0人  Mr_约科
小项 备注
时间 2020年2月22日
修改时间 2020年3月14日
城市 北京市房山区
天气
心情 充实

先附上B站录播回放
https://www.bilibili.com/video/av90736161

2020年2月20日,虚幻社区经理大钊在B站进行了近三个小时的直播,其主题是【虚幻C++进阶之路】,首先向他致谢。
听完之后,我想输出一下,自己的一些感受和疑问,自问自答。
总体分为了五个部分,个人觉得最接地气,最具有干货的是第二部分,当然每一个部分都很重要,但是对于目前还是小白的我,可能第二部分对我来说,更有实用性。

一、

1. 虚幻引擎的学习之路

首先将每一个使用虚幻的人(无论是学习者还是工作者),分为了五个层次,而每一个层级都给与了一个能力标志,结合自己的能力,看看自己处于哪个阶段。
我的情况,可能比较特殊一点,没有经过蓝图,直接上了C++,所以现在处于一个跛脚的状态。如果非要给自己归一个阶段的话,我觉得是0.5吧,自己目前还不能独立开发一个小游戏。

2. 虚幻C++的进阶之路

这一部分,比较重要,通过5W1H去讲解,无论是对项目还是学习,都比较实用。那么我就说几个自己比较有触的点。

(1)为什么要用C++

C++的上下限很宽,这个域很广,是一种自我负责,而不是别人照顾,受制于人的语言。

(2)C系列语言之间的区别?
小项 C语言 C++ C#
编译方面
(3)GamePlay框架
GamePlay.png

参考文章
https://zhuanlan.zhihu.com/p/22833151

(4)Module—UBT—C#

C#在虚幻C++中是脚本配置文件 1. Include了哪些头文件 2. 链接的 DLL

Module - UBT - C#
(5)右键Build之后, 有哪些幕后工作
Module_UBT

①UBT(C#编写)将项目的C#文件(Target.cs、Build.cs配置信息)收集起来,【判断哪些文件被修改】;
②调用UHT(C++编写)(文本解析工具,不是编译工具),根据UCLASS、等宏(所有的宏),生成Intermediate下的 generated.h;
③UHT将第二步生成的文件和Source文件夹下的文件,合在一起编译一下。

参考文章
https://zhuanlan.zhihu.com/p/22814098

(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文件夹下,改怎么办?

功底 === 概念理解的清晰度

上一篇下一篇

猜你喜欢

热点阅读