UE4中类自动生成代码解析
来源:互联网 发布:mac响声很大 编辑:程序博客网 时间:2024/06/05 08:18
本文章由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来生成头文件的内容。
FinalOutput = "// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "GameFramework/Pawn.h"#include "MyPawn.generated.h"UCLASS()class HOWTO_VTE_API AMyPawn : public APawn{ GENERATED_BODY()public: // Sets default values for this pawn's properties AMyPawn();protected: // Called when the game starts or when spawned virtual void BeginPlay() override;public: // Called every frame virtual void Tick(float DeltaTime) override; // Called to bind functionality to input virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;};"
4. 生成CPP文件
GenerateClassCPPFile
CPP = // Fill out your copyright notice in the Description page of Project Settings.#include "HowTo_VTE.h"#include "MyPawn.h"// Sets default valuesAMyPawn::AMyPawn(){ // Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true;}// Called when the game starts or when spawnedvoid AMyPawn::BeginPlay(){ Super::BeginPlay(); %CURSORFOCUSLOCATION%}// Called every framevoid AMyPawn::Tick(float DeltaTime){ Super::Tick(DeltaTime);}// Called to bind functionality to inputvoid AMyPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent){ Super::SetupPlayerInputComponent(PlayerInputComponent);}
5. 编译
检测是否可避免全部编译工程,自动热加载,代码首次编译,RecompileModule —>
CheckForFinishedModuleDLLCompile
图3
6. 工程重新加载。
代码生成完毕。
二、 一张图
图4
一图千言
三、 文件生成模板
UE4 代码写的很精妙!
看模板头文件生成:
FString FinalOutput = Template.Replace(TEXT("%COPYRIGHT_LINE%"), *MakeCopyrightLine(), ESearchCase::CaseSensitive); FinalOutput = FinalOutput.Replace(TEXT("%UNPREFIXED_CLASS_NAME%"), *UnPrefixedClassName, ESearchCase::CaseSensitive); FinalOutput = FinalOutput.Replace(TEXT("%CLASS_MODULE_API_MACRO%"), *ModuleAPIMacro, ESearchCase::CaseSensitive); FinalOutput = FinalOutput.Replace(TEXT("%UCLASS_SPECIFIER_LIST%"), *MakeCommaDelimitedList(ClassSpecifierList, false), ESearchCase::CaseSensitive); FinalOutput = FinalOutput.Replace(TEXT("%PREFIXED_CLASS_NAME%"), *PrefixedClassName, ESearchCase::CaseSensitive); FinalOutput = FinalOutput.Replace(TEXT("%PREFIXED_BASE_CLASS_NAME%"), *PrefixedBaseClassName, ESearchCase::CaseSensitive); FinalOutput = FinalOutput.Replace(TEXT("%EVENTUAL_CONSTRUCTOR_DECLARATION%"), *EventualConstructorDeclaration, ESearchCase::CaseSensitive); FinalOutput = FinalOutput.Replace(TEXT("%CLASS_PROPERTIES%"), *ClassProperties, ESearchCase::CaseSensitive); FinalOutput = FinalOutput.Replace(TEXT("%CLASS_FUNCTION_DECLARATIONS%"), *ClassFunctionDeclarations, ESearchCase::CaseSensitive); 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
%COPYRIGHT_LINE%#pragma once%BASE_CLASS_INCLUDE_DIRECTIVE%#include "%UNPREFIXED_CLASS_NAME%.generated.h"UCLASS(%UCLASS_SPECIFIER_LIST%)class %CLASS_MODULE_API_MACRO%%PREFIXED_CLASS_NAME% : public %PREFIXED_BASE_CLASS_NAME%{ GENERATED_BODY()public: // Sets default values for this pawn's properties %PREFIXED_CLASS_NAME%();protected: // Called when the game starts or when spawned virtual void BeginPlay() override;public: // Called every frame virtual void Tick(float DeltaTime) override; // Called to bind functionality to input virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; %CLASS_FUNCTION_DECLARATIONS% %CLASS_PROPERTIES%};
PawnClass.cpp.template
%COPYRIGHT_LINE%#include "%MODULE_INCLUDE_PATH%"#include "%UNPREFIXED_CLASS_NAME%.h"%ADDITIONAL_INCLUDE_DIRECTIVES%// Sets default values%PREFIXED_CLASS_NAME%::%PREFIXED_CLASS_NAME%(){ // Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true;}// Called when the game starts or when spawnedvoid %PREFIXED_CLASS_NAME%::BeginPlay(){ Super::BeginPlay(); %CURSORFOCUSLOCATION%}// Called every framevoid %PREFIXED_CLASS_NAME%::Tick(float DeltaTime){ Super::Tick(DeltaTime);}// Called to bind functionality to inputvoid %PREFIXED_CLASS_NAME%::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent){ Super::SetupPlayerInputComponent(PlayerInputComponent);}%ADDITIONAL_MEMBER_DEFINITIONS%
是不是可以自定义头文件呢,估计可以。暂时没有研究。
UE4 工程量太大了,什么样脑子才能架构这玩意啊,他们都是天才!
UE4Paragon游戏人物截图!
谢谢浏览,欢迎点赞!!!
- UE4中类自动生成代码解析
- 自动生成代码类
- Hibernate中代码自动生成小结- -
- java中自动生成注册码的代码
- Eclipse中mybatis自动生成代码
- mybatis中代码自动生成gengrator
- Yii中gii自动生成代码
- tensorflow代码全解析 -3- seq2seq 自动生成文本
- 自制工具:CSV代码生成器:自动生成CSV文件对应的C++实体类和字段类型解析代码
- 自制工具:CSV代码生成器:自动生成CSV文件对应的C++实体类和字段类型解析代码
- HEW中RX62N工程自动生成文件的解析
- HEW中RX62N工程自动生成文件的解析
- UE4中蓝图转换成C++代码
- ue4在Xcode中没有代码提示
- AOS 自动生成代码类说明
- 代码自动生成.
- 自动生成代码
- 代码自动生成软件
- C++中相对路径与绝对路径以及斜杠与反斜杠的区别
- 获取Android设备的唯一标识符
- arttemplate模板
- 关于Springboot调错篇
- JXNU 2017 校ACM程序设计竞赛(16级)题解
- UE4中类自动生成代码解析
- Grouping测试-Storm
- ubuntu开发环境
- 6-13总结
- 无线OSS-高精度整数加法(加数可以为负数,应实现高精度加减法)
- C++期末复习练手题
- arttemplate模板--绑定集合
- idea集成svn
- 实际工作中:----mybatis长用的mapper.xml