UE5 C++学习笔记

Log

  • Log类型ELogVerbosity
    • Log
    • Warning
    • Error
    • All
  • UE_LOG
    • 如何使用UE_LOG
      1
      2
      3
      4
      5
      6
      7
      8
      //单个文件,定义自己的Log类型
      DEFINE_LOG_CATEGORY_STATIC(CategoryName,Log,All);

      //全局文件定义,需要include头文件
      // xxx.h 头文件声明一个Category为extern,避免多个文件使用此头文件时重复声明
      DECLARE_LOG_CATEGORY_EXTERN(CategoryName, Log, All)
      // xxx.cpp 源文件定义该Category,全局仅需一份
      DEFINE_LOG_CATEGORY(CategoryName)
  • UE_LOG格式化输出
    1
    2
    3
    UE_LOG(LogTemp, Warning, TEXT("init"));
    UE_LOG(LogTemp, Log, TEXT("Key : %d Value: %s"), Test.key, Test.Value);
    GEngine->AddOnScreenDebugMessage(0, 2.0f, FColor::Yellow, TEXT("init"));

Debug

命名规范

  • UE4 C++基础 - 编码规范
  • T 表示模板类
  • U 表示类继承自 UObject
  • A 表示类继承自 AActor
  • S 表示类继承自 SWidget
  • I 表示抽象接口类
  • E 表示枚举
  • b 表示布尔值
  • F 表示其他不满足上述规则的类

Get

  • GEngine->getXXX()
  • GEditor->getXXX()
  • GEditor->GetEditorWorldContext().World()

Spawn

TArray TMap

Reflection

Module | Plugin

Engine Module

API

  • Core
    • 基础数据类型:int32 FString float
    • 数学函数,结构体:FMath FVector
    • 容器:TArray TList TMap
  • CoreUObject
    • 基础类:UObject UClass UProperty UPackage
    • 对象内存分配函数:ConstuctObject FindObject Cast
  • Engine
    • 场景对象、组件:AActor APawn UActorComponent
    • 关卡、世界、玩家:UWorld ULevel UPlayer
    • 模型、纹理、材质:UTexture UMaterial UStaticMesh
  • Slate

UObject

Editor

String

  • UE4 C++基础 - 字符串和本地化

  • FString 属于可变字符串

  • FName FText 属于不可变字符串,创建后内容不能改变

  • FName 不区分大小写,主要用于标识资源路径,它的优点就是查找和访问速度快

  • FString转换至FName时会丢失原始字符串的大小写信息

  • FText 主要用于文本本地化

  • 格式化

    • FString::Printf(TEXT(“FormatString:\n%s%s%s”), *A, *B, *Plus);

Thread

Pointer

GC

Tools

Third Party C++ Library

Summary

信息是一种能量,只有足够的信息,才能达到质变(Epic大钊)

Build Cmd

UE项目工程

1
2
3
4
5
6
7
8
9
10
11
12
set engine=D:\Software\UE_5.0
set project=D:\Work\Git\Library\PCG\PCG.uproject
set UBT=%engine%\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool
set Build=%engine%\Engine\Build\BatchFiles\Build.bat

cd /d %engine%
# VisualStudio工程
%UBT% -projectfiles -project=%project% -game -engine -progress -2019
# VScode工程
%UBT% -projectfiles -vscode -project=%project% -game engine -progress -2022
# Editor Development编译模式
%Build% XXXEditor Win64 Development %project% -waitmutex

UE源码工程

1
2
3
4
5
6
7
8
9
10
11
@echo off

set UE5=%~dp0
set UBTProject=%UE5%Engine\Source\Programs\UnrealBuildTool\UnrealBuildTool.csproj
set UBT=%UE5%\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool

cd /d %UE5%
@REM compile UBT
dotnet build --configuration Development %UBTProject%
@REM generate projectfiles
%UBT% -projectfiles -vscode -engine -dotnet

RunUAT编译

Reference

Geometry

Landscape

  • FHoudiniLandscapeTranslator::ImportLandscapeData => SetMaskLayer

  • FHoudiniLandscapeTranslator::BackupLandscapeToImageFiles => ExportHeightLayer

  • FHoudiniLandscapeTranslator::CreateOrUpdateLandscapeLayerData

    • ULandscapeLayerInfoObject* LayerInfo = GetLandscapeLayerInfoForLayer()
    • LayerInfo = FindOrCreateLandscapeLayerInfoObject()
  • FLandscapeLayer

    • OnGetImportLayerCreateMenu //GUI Create
      • OnImportLayerCreateClicked
  • Process

    • ULandscapeLayerInfoObject => create layerInfo package
    • Switch Material
      • Import Layer from texture
      • Find or Create layerInfo
      • set layerInfo
        • FHoudiniLandscapeTranslator::OutputLandscape_GenerateTile
        • TArray LayerInfos;
        • for (const auto& ImportLayerInfo : LayerInfos)
          • LandscapeActor->EditorLayerSettings.Add(FLandscapeEditorLayerSettings(ImportLayerInfo.LayerInfo))
      • create layerInfo
        • FHoudiniLandscapeTranslator::CreateOrUpdateLandscapeLayerData
        • FHoudiniLandscapeTranslator::FindOrCreateLandscapeLayerInfoObject
  • ALandscapeProxy

    • ULandscapeInfo *LandscapeInfo = Landscape->GetLandscapeInfo();
  • ALandscape : public ALandscapeProxy

    • Landscape = World->SpawnActor()
    • Landscape->Import()
    • ULandscapeInfo *LandscapeInfo = Landscape->GetLandscapeInfo();
    • LandscapeInfo->UpdateLayerInfoMap(Landscape);
    • Landscape->RegisterAllComponents();
  • Engine\Source\Editor\LandscapeEditor\Private\LandscapeEditorDetailCustomization_ImportLayers.cpp

  • Engine\Source\Editor\LandscapeEditor\Private\LandscapeEditorDetailCustomization_ImportExport.cpp

  • Engine\Source\Editor\LandscapeEditor\Private\LandscapeEditorDetailCustomization_TargetLayers.cpp

    • OnTargetLayerDeleteClicked
  • The import size (505×505) does not match the current Landscape extent (0×0), if you continue it will be padded/clipped to fit

  • Engine\Source\Editor\LandscapeEditor\Private\LandscapeEdMode.cpp

    • FEdModeLandscape::ChangeComponentSetting
      • TMap<FGuid, TArray> HeightDataPerLayers;
      • TMap<FGuid, TArray> ImportMaterialLayerInfosPerLayers;
      • auto ExtractHeightmapWeightmapContent = [&](TArray& OutHeightData, TArray& OutImportMaterialLayerInfos)
      • if (HasLandscapeLayersContent()) // edit layers
        • ExtractHeightmapWeightmapContent(HeightData, ImportMaterialLayerInfos);
        • ImportMaterialLayerInfosPerLayers.Add(FGuid(), MoveTemp(ImportMaterialLayerInfos)); // add data
        • NewLandscape->Import(FGuid::NewGuid(), NewMinX, NewMinY, NewMaxX, NewMaxY, NumSubsections, SubsectionSizeQuads, HeightDataPerLayers, *OldLandscape->ReimportHeightmapFilePath, ImportMaterialLayerInfosPerLayers, ELandscapeImportAlphamapType::Additive, LandscapeLayers);
        • Import // create new landscape components
          • Import(const FGuid& InGuid, int32 InMinX, int32 InMinY, int32 InMaxX, int32 InMaxY, int32 InNumSubsections, int32 InSubsectionSizeQuads, const TMap<FGuid, TArray>& InImportHeightData, const TCHAR* const InHeightmapFileName, const TMap<FGuid, TArray>& InImportMaterialLayerInfos, ELandscapeImportAlphamapType InImportMaterialLayerType, const TArray* InImportLayers = nullptr);
          • const TMap<FGuid, TArray>& InImportMaterialLayerInfos
          • ALandscapeProxy::Import
            • Source\Runtime\Landscape\Private\LandscapeEdit.cpp
        • Import // Houdini Engine Import Method
          • FHoudiniLandscapeTranslator::UpdateLandscapeMaterialLayers(ALandscape* InLandscape,const TArray& LayerInfos)

Foliage || Landscape

  • FoliageType
    • LandscapeLayers
  • Source\Editor\FoliageEdit\Private\FoliageEdMode.cpp
    • GetMaxHitWeight()
      • ULandscapeComponent* HitLandscape
      • float HitWeight = HitLandscape->GetLayerWeightAtLocation(Location,LayerName,LayerCache)

UE5 C++学习笔记
https://automask.github.io/wild/2022/11/25/log/P_UE_C++_2.0/
作者
Kyle Zhou
发布于
2022年11月25日
许可协议