美文网首页
Unreal 虚幻C++进阶之路—致敬大钊

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

作者: Mr_约科 | 来源:发表于2020-02-22 23:29 被阅读0次
    小项 备注
    时间 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文件夹下,改怎么办?

    • 可通过Uproperty反射,因为对象一般有这个宏,才支持GC
    • 就算没有,也可通过对象池中,通过类型(FindObject)找到

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

    相关文章

      网友评论

          本文标题:Unreal 虚幻C++进阶之路—致敬大钊

          本文链接:https://www.haomeiwen.com/subject/pbalqhtx.html