本文章由cartzhang编写,转载请注明出处。 所有权利保留。

文章链接:http://blog.csdn.net/cartzhang/article/details/73189272

作者:cartzhang

一、 UE4 C++ 代码自动生成流程

1. 界面点击生成C++类

图1

先调用 SMenuEntryBlock::OnClicked ,然后调用UI_COMMAND(AddCodeToProject) —-> FMainFrameActionCallbacks::AddCodeToProject(),—-> OpenAddCodeToProjectDialog来打开基类选择界面。

2. 点击Create Class按钮

图2

OnFinished(this, &SNewClassDialog::FinishClicked)

调用函数SNewClassDialog::FinishClicked()—>AddCodeToProject —>GameProjectUtils::AddCodeToProject_Internal(核心都在这里实现)

3. 头文件生成

拼接文件路径信息,GameProjectUtils::GenerateClassHeaderFile来生成头文件的内容。

  1. FinalOutput = "
  2. // Fill out your copyright notice in the Description page of Project Settings.
  3. #pragma once
  4. #include "GameFramework/Pawn.h"
  5. #include "MyPawn.generated.h"
  6. UCLASS()
  7. class HOWTO_VTE_API AMyPawn : public APawn
  8. {
  9. GENERATED_BODY()
  10. public:
  11. // Sets default values for this pawn's properties
  12. AMyPawn();
  13. protected:
  14. // Called when the game starts or when spawned
  15. virtual void BeginPlay() override;
  16. public:
  17. // Called every frame
  18. virtual void Tick(float DeltaTime) override;
  19. // Called to bind functionality to input
  20. virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
  21. };
  22. "

4. 生成CPP文件

GenerateClassCPPFile

  1. CPP = // Fill out your copyright notice in the Description page of Project Settings.
  2. #include "HowTo_VTE.h"
  3. #include "MyPawn.h"
  4. // Sets default values
  5. AMyPawn::AMyPawn()
  6. {
  7. // Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
  8. PrimaryActorTick.bCanEverTick = true;
  9. }
  10. // Called when the game starts or when spawned
  11. void AMyPawn::BeginPlay()
  12. {
  13. Super::BeginPlay();
  14. %CURSORFOCUSLOCATION%
  15. }
  16. // Called every frame
  17. void AMyPawn::Tick(float DeltaTime)
  18. {
  19. Super::Tick(DeltaTime);
  20. }
  21. // Called to bind functionality to input
  22. void AMyPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
  23. {
  24. Super::SetupPlayerInputComponent(PlayerInputComponent);
  25. }

5. 编译

检测是否可避免全部编译工程,自动热加载,代码首次编译,RecompileModule —>

CheckForFinishedModuleDLLCompile

图3

6. 工程重新加载。

代码生成完毕。

二、 一张图

图4

一图千言

三、 文件生成模板

UE4 代码写的很精妙!

看模板头文件生成:

  1. FString FinalOutput = Template.Replace(TEXT("%COPYRIGHT_LINE%"), *MakeCopyrightLine(), ESearchCase::CaseSensitive);
  2. FinalOutput = FinalOutput.Replace(TEXT("%UNPREFIXED_CLASS_NAME%"), *UnPrefixedClassName, ESearchCase::CaseSensitive);
  3. FinalOutput = FinalOutput.Replace(TEXT("%CLASS_MODULE_API_MACRO%"), *ModuleAPIMacro, ESearchCase::CaseSensitive);
  4. FinalOutput = FinalOutput.Replace(TEXT("%UCLASS_SPECIFIER_LIST%"), *MakeCommaDelimitedList(ClassSpecifierList, false), ESearchCase::CaseSensitive);
  5. FinalOutput = FinalOutput.Replace(TEXT("%PREFIXED_CLASS_NAME%"), *PrefixedClassName, ESearchCase::CaseSensitive);
  6. FinalOutput = FinalOutput.Replace(TEXT("%PREFIXED_BASE_CLASS_NAME%"), *PrefixedBaseClassName, ESearchCase::CaseSensitive);
  7. FinalOutput = FinalOutput.Replace(TEXT("%EVENTUAL_CONSTRUCTOR_DECLARATION%"), *EventualConstructorDeclaration, ESearchCase::CaseSensitive);
  8. FinalOutput = FinalOutput.Replace(TEXT("%CLASS_PROPERTIES%"), *ClassProperties, ESearchCase::CaseSensitive);
  9. FinalOutput = FinalOutput.Replace(TEXT("%CLASS_FUNCTION_DECLARATIONS%"), *ClassFunctionDeclarations, ESearchCase::CaseSensitive);
  10. FinalOutput = FinalOutput.Replace(TEXT("%BASE_CLASS_INCLUDE_DIRECTIVE%"), *BaseClassIncludeDirective, ESearchCase::CaseSensitive);

CPP文件也类似的。

其中,Tmplate得到是某个继承类的模板字符串,然后通过特定符号来进行替换,生成文件。

模板文件的路径在:UE4_source\UnrealEngine\Engine\Content\Editor\Templates\

比如测试的继承基类为Pawn,他们的模板头文件和CPP文件分别为: PawnClass.h.template 和PawnClass.cpp.template 。

可以自行打开和修改文件。

PawnClass.h.template

  1. %COPYRIGHT_LINE%
  2. #pragma once
  3. %BASE_CLASS_INCLUDE_DIRECTIVE%
  4. #include "%UNPREFIXED_CLASS_NAME%.generated.h"
  5. UCLASS(%UCLASS_SPECIFIER_LIST%)
  6. class %CLASS_MODULE_API_MACRO%%PREFIXED_CLASS_NAME% : public %PREFIXED_BASE_CLASS_NAME%
  7. {
  8. GENERATED_BODY()
  9. public:
  10. // Sets default values for this pawn's properties
  11. %PREFIXED_CLASS_NAME%();
  12. protected:
  13. // Called when the game starts or when spawned
  14. virtual void BeginPlay() override;
  15. public:
  16. // Called every frame
  17. virtual void Tick(float DeltaTime) override;
  18. // Called to bind functionality to input
  19. virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
  20. %CLASS_FUNCTION_DECLARATIONS%
  21. %CLASS_PROPERTIES%
  22. };

PawnClass.cpp.template

  1. %COPYRIGHT_LINE%
  2. #include "%MODULE_INCLUDE_PATH%"
  3. #include "%UNPREFIXED_CLASS_NAME%.h"
  4. %ADDITIONAL_INCLUDE_DIRECTIVES%
  5. // Sets default values
  6. %PREFIXED_CLASS_NAME%::%PREFIXED_CLASS_NAME%()
  7. {
  8. // Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
  9. PrimaryActorTick.bCanEverTick = true;
  10. }
  11. // Called when the game starts or when spawned
  12. void %PREFIXED_CLASS_NAME%::BeginPlay()
  13. {
  14. Super::BeginPlay();
  15. %CURSORFOCUSLOCATION%
  16. }
  17. // Called every frame
  18. void %PREFIXED_CLASS_NAME%::Tick(float DeltaTime)
  19. {
  20. Super::Tick(DeltaTime);
  21. }
  22. // Called to bind functionality to input
  23. void %PREFIXED_CLASS_NAME%::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
  24. {
  25. Super::SetupPlayerInputComponent(PlayerInputComponent);
  26. }
  27. %ADDITIONAL_MEMBER_DEFINITIONS%

是不是可以自定义头文件呢,估计可以。暂时没有研究。

UE4 工程量太大了,什么样脑子才能架构这玩意啊,他们都是天才!


UE4Paragon游戏人物截图!

谢谢浏览,欢迎点赞!!!

UE4中类自动生成代码解析的更多相关文章

  1. 【MyBatis】MyBatis自动生成代码查询之爬坑记

    前言 项目使用SSM框架搭建Web后台服务,前台后使用restful api,后台使用MyBatisGenerator自动生成代码,在前台使用关键字进行查询时,遇到了一些很宝贵的坑,现记录如下.为展示 ...

  2. 02 使用Mybatis的逆向工程自动生成代码

    1.逆向工程的作用 Mybatis 官方提供了逆向工程,可以针对数据库表自动生成Mybatis执行所需要的代码(包括mapper.xml.Mapper.java.pojo). 2.逆向工程的使用方法 ...

  3. 使用mybatis-generator-core自动生成代码

    SSM框架可以使用mybatis-generator-core-1.3.2.jar来自动生成代码,以下是配置和使用的代码. generatorConfig.xml <?xml version=& ...

  4. Maven mybatis-generator自动生成代码

    mybatis-generator可以自动生成代码,不管你是否喜欢它生成的代码的风格,它确实有助于我们更快速便捷的生成代码. Maven pom文件配置: <build> <plug ...

  5. springboot mybatis 自动生成代码(maven+IntelliJ IDEA)

    1.在pom文件中加入需要的依赖(mybatis-generator-core) 和 插件(mybatis-generator-maven-plugin) <dependency> < ...

  6. IDEA Maven Mybatis generator 自动生成代码(实例讲解)(转)

    IDEA Maven Mybatis generator 自动生成代码(实例讲解) MyBatis Generator • 简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的 ...

  7. (转)MyBatis框架的学习(七)——MyBatis逆向工程自动生成代码

    http://blog.csdn.net/yerenyuan_pku/article/details/71909325 什么是逆向工程 MyBatis的一个主要的特点就是需要程序员自己编写sql,那么 ...

  8. 使用Mybatis的逆向工程自动生成代码

    1.逆向工程的作用 Mybatis 官方提供了逆向工程,可以针对数据库表自动生成Mybatis执行所需要的代码(包括mapper.xml.Mapper.java.pojo). 2.逆向工程的使用方法 ...

  9. MyBatis框架之mybatis逆向工程自动生成代码

    http://www.jb51.net/article/82062.htm Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们 ...

随机推荐

  1. 【转】获取Windows系统明文密码神器

    前序 电脑密码忘记了可以用本工具找回,前提是你能进入系统,例如本机保存了远程服务器登录的密码或借别人的电脑,而忘记了密码:mimikatz 2.0工具正好解决了你的问题. 工具下载 binaires ...

  2. 【TensorFlow/简单网络】MNIST数据集-softmax、全连接神经网络,卷积神经网络模型

    初学tensorflow,参考了以下几篇博客: soft模型 tensorflow构建全连接神经网络 tensorflow构建卷积神经网络 tensorflow构建卷积神经网络 tensorflow构 ...

  3. ADO.NET 使用DELETE语句批量删除操作,提示超时,删除失败,几种优化解决思路

    起因是如此简单的一句sql 提示:Timeout 时间已到.在操作完成之前超时时间已过或服务器未响应. 提供几种解决思路: 1.检查WHERE条件中字段是否已建索引 2.检查是否被其他表引用,引用表外 ...

  4. MAC OS 命令行使用详解【转】

    你可以整天驾驶汽车而不用知道如何修理它们,但是如果你希望当一个维护员,你就需要知道事情是如何运作的.同样的事情也发生在了 Mac OS X 上:你可以一直使用 Mac 而不用知道如何修理它,但是如果你 ...

  5. LA 5713 秦始皇修路

    https://vjudge.net/problem/UVALive-5713 题意: 秦朝有n个城市,需要修建一些道路使得任意两个城市之间都可以连通.道士徐福声称他可以用法术修路,不花钱,也不用劳动 ...

  6. Python类变量,实例变量,类方法,实例方法,静态方法的分析

    Python作为动态语言,跟静态语言如c/c++有很大区别,其中的一个重要的特性就是Python的变量无需声明直接可用.同样,类的成员变量无需声明,直接可用.目的是为了动态语言跟灵活,在思路想到的时候 ...

  7. (局部刷新)jquery.ajax提交并实现单个div刷新

    web开发中我们经常会遇到局部刷新页面的需求,以前我经常使用ajax和iframe实现局部刷新,后来做政府的项目,对页面的样式要求比较多,发现使用iframe控制样式什么的很麻烦,所以就采用了新的办法 ...

  8. php特级课---4、网站服务监控

    php特级课---4.网站服务监控 一.总结 一句话总结:这些是架构师的知识 网络流量监控:cacti,mrtg 邮件报警系统:postfix 压力测试工具:Apache压力测试软件-ab,Mysql ...

  9. 明确出需求 然后开会评审 要什么接口 接口参数、返回json内容、格式 协定好 在做

     明确出需求 然后开会评审 要什么接口 接口参数.返回json内容.格式 协定好 在做 

  10. day32 Python与金融量化分析(二)

    第一部分:金融与量化投资 股票: 股票是股份公司发给出资人的一种凭证,股票的持有者就是股份公司的股东. 股票的面值与市值 面值表示票面金额 市值表示市场价值 上市/IPO: 企业通过证券交易所公开向社 ...