Tutorial Notes Help

关于UE4自定义新建文件模板及在Rider中的使用

  1. UE源码中新建文件模板的位置大致位于: Engine\Source\Editor\GameProjectGeneration\Private\GameProjectUtils.cpp (maybe 3233 Line) 可参见以下函数:

    bool GameProjectUtils::GenerateClassHeaderFile( const FString& NewHeaderFileName, const FString UnPrefixedClassName, const FNewClassInfo ParentClassInfo, const TArray<FString>& ClassSpecifierList, const FString& ClassProperties, const FString& ClassFunctionDeclarations, FString& OutSyncLocation, const FModuleContextInfo& ModuleInfo, bool bDeclareConstructor, FText& OutFailReason)
    bool GameProjectUtils::GenerateClassCPPFile( const FString& NewCPPFileName, const FString UnPrefixedClassName, const FNewClassInfo ParentClassInfo, const TArray<FString>& AdditionalIncludes, const TArray<FString>& PropertyOverrides, const FString& AdditionalMemberDefinitions, FString& OutSyncLocation, const FModuleContextInfo& ModuleInfo, FText& OutFailReason)
    bool GameProjectUtils::GenerateGameModuleBuildFile( const FString& NewBuildFileName, const FString& ModuleName, const TArray<FString>& PublicDependencyModuleNames, const TArray<FString>& PrivateDependencyModuleNames, FText& OutFailReason)
    bool GameProjectUtils::GeneratePluginModuleBuildFile( const FString& NewBuildFileName, const FString& ModuleName, const TArray<FString>& PublicDependencyModuleNames, const TArray<FString>& PrivateDependencyModuleNames, FText& OutFailReason, bool bUseExplicitOrSharedPCHs/* = true*/)
  2. 模板中对应的宏指令表格(欲知后事如何,且听下回分解!):

    宏指令

    说明

    位置

    %COPYRIGHT_LINE%

    版权信息

    .h/.cpp

    %UNPREFIXED_CLASS_NAME%

    无前缀的类名

    .h/.cpp

    %PREFIXED_CLASS_NAME%

    带前缀的类名

    .h/.cpp

    %MODULE_NAME%

    模块名称

    .h/.cpp

    %CLASS_MODULE_API_MACRO%

    类所在模块的API宏

    .h

    %UCLASS_SPECIFIER_LIST%

    UCLASS()的参数列表

    .h

    %PREFIXED_BASE_CLASS_NAME%

    带前缀的基类名

    .h

    %EVENTUAL_CONSTRUCTOR_DECLARATION%

    .h

    %CLASS_PROPERTIES%

    .h

    %CLASS_FUNCTION_DECLARATIONS%

    .h

    %BASE_CLASS_INCLUDE_DIRECTIVE%

    .h

    %PCH_INCLUDE_DIRECTIVE%

    .cpp

    %MY_HEADER_INCLUDE_DIRECTIVE%

    .cpp

    %ADDITIONAL_INCLUDE_DIRECTIVES%

    .cpp

    %EVENTUAL_CONSTRUCTOR_DEFINITION%

    .cpp

    %ADDITIONAL_MEMBER_DEFINITIONS%

    .cpp

  3. 关于在Rider中的使用

    1. 进入设置后按步骤进行对应设置即可。

      img_5.png

      这边Rider的macro选择Substitute Unreal template macros ,大意为替换Unreal对应的宏

  4. 注意事项: 注意!目前这种方式添加模板会有很大的局限性,请使用以下方式添加模板:

    • D:\UE_4.26\Engine\Content\Editor\Templates中添加对应的cpp和h文件,然后重新打开项目让rider自动导入模板,建议直接关闭所有rider重新打开一次。

    • 如果右键新建看不到的话,检查设置中对应模板的Add to "New..." menu是否勾选

  • 目前根据Unreal中的源码审查结果来看:

FString FNewClassInfo::GetHeaderTemplateFilename() const { switch(ClassType) { case EClassType::UObject: { if (BaseClass != nullptr) { if ((BaseClass == UActorComponent::StaticClass()) || (BaseClass == USceneComponent::StaticClass())) { return TEXT("ActorComponentClass.h.template"); } else if (BaseClass == AActor::StaticClass()) { return TEXT("ActorClass.h.template"); } else if (BaseClass == APawn::StaticClass()) { return TEXT("PawnClass.h.template"); } else if (BaseClass == ACharacter::StaticClass()) { return TEXT("CharacterClass.h.template"); } } // Some other non-actor, non-component UObject class return TEXT( "UObjectClass.h.template" ); } case EClassType::EmptyCpp: return TEXT("EmptyClass.h.template"); case EClassType::SlateWidget: return TEXT("SlateWidget.h.template"); case EClassType::SlateWidgetStyle: return TEXT("SlateWidgetStyle.h.template"); case EClassType::UInterface: return TEXT("InterfaceClass.h.template"); default: break; } return TEXT(""); }
  • 易知,自定义类型一般会作为一般的UObject处理,即类名前缀已U开头,因此,在模板编辑框中做如下修改,以匹配GameMode类型,同理其他类也可如此处理:

  • $CLASS_MODULE_API_MACRO$ $PREFIX$$UNPREFIXED_CLASS_NAME$=> $CLASS_MODULE_API_MACRO$ A$UNPREFIXED_CLASS_NAME$

  • 注意:此时更改完会在项目根目录下生成一个$PROJECT_NAME$.uproject.DotSettings.user的文件保存你刚刚更改的内容。

  • 如果想要在其他项目中使用可以考虑复制这个文件过去或者使用Rider的Layer层设置将其保存到本机的全局中

参考模板:

GameModeClass.h.template

%COPYRIGHT_LINE% #pragma once #include "CoreMinimal.h" #include "GameFramework/GameModeBase.h" #include "%UNPREFIXED_CLASS_NAME%.generated.h" UCLASS(%UCLASS_SPECIFIER_LIST%) class %CLASS_MODULE_API_MACRO%%PREFIXED_CLASS_NAME% : public AGameModeBase { GENERATED_BODY() public: };

GameModeClass.cpp.template

%COPYRIGHT_LINE% %PCH_INCLUDE_DIRECTIVE% %MY_HEADER_INCLUDE_DIRECTIVE% %ADDITIONAL_INCLUDE_DIRECTIVES% %ADDITIONAL_MEMBER_DEFINITIONS%
Last modified: 16 十一月 2023