反射宏

GENERATED_BODY

放在类的里面

  • 不使用父类的构造函数,需要手动在头文件中声明构造函数,然后在源文件实现该构造函数

  • 该宏之后的成员默认为private


GENERATED_UCLASS_BODY

放在类的里面

  • 使用父类的构造函数,可直接在源文件实现构造函数,而不需要在头文件去声明

  • 会自动生成带有特定参数的构造函数

  • 该宏之后的成员默认为public


UCLASS

放在类的头部

  • 告知该类为虚幻引擎类

  • 该类必须派生自UObject


USTRUCT

放在结构体的头部

  • 声明该结构体在虚幻反射系统中的行为

  • 可在编辑器中编辑此结构体

  • 可在蓝图中编辑此结构体


UENUM

放在枚举的头部

  • 声明该枚举在虚幻反射系统中的行为

  • 可在编辑器中编辑此枚举

  • 可在蓝图中编辑此枚举


UPROPERTY

放在成员属性上面

  • 声明该属性在虚幻反射系统中的行为

  • 可在编辑器中编辑此成员属性

  • 可在蓝图中编辑此成员属性


UFUNCTION

放在成员函数上面

  • 声明该函数在虚幻反射系统中的行为

  • 可在编辑器中调用此成员函数

  • 可在蓝图中调用此成员函数


日志

UE_LOG

编辑器日志中打印

UE_LOG(LogTemp, Warning, TEXT("Log text."));
UE_LOG(LogTemp, Warning, TEXT("Log text.%d"), 32, ...);
  • LogTemp

    • 临时日志记录类别名称

  • Warning

    • 打印级别

    • Error - 错误(红)

    • Warning - 警告(黄)

    • Display - 普通(白)

  • TEXT("Log text.")

    • 打印的内容

    • 可以为格式化字符串

  • 32…

    • 格式化字符串的值


AddOnScreenDebugMessage

屏幕右上角打印

GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, TEXT("Log text."));
  • -1

    • 默认值

  • 5.f

    • 打印显示的时间

  • FColor::Blue

    • 文本显示的颜色

  • TEXT("Log text.")

    • 打印的内容


字符串

FString

  • 更类似于C++中的std::string

  • 可以修改,有更多操作

  • 性能低


FName

  • 着重于表示名称

  • 不区分大小写

  • 不可修改

  • 在创建时会根据内容创建哈希值,同一个哈希值的内容只会被创建一次

  • 查找和访问时速度快

  • 使用哈希值比较区分不同的FName


FText

  • 着重于显示和本地化

  • 不可更改

  • 相对臃肿


互相转换

FString -> FName

FString str = TEXT("I am str.");
FName name = FName(*str);

FString -> FText

FString str = TEXT("I am str.");
FText text = FText::FromString(str);

FName -> FString

FName str = TEXT("I am str.");
FString fstr = str.ToString();

FName -> FText

FName str = TEXT("I am str.");
FText text = FText::FromName(str);

FText -> FString

FText str = FText::FromString("I am FString.");
FString fstr = str.ToString();

FString -> std::string

FString Str = "C++";
std::string cstr(TCHAR_TO_UTF8(*Str));

std::string -> FString

std::string cstr = "text";
ClientMessage(FString(cstr.c_str()));

容器

TArray

  • 是U++中的动态数组

  • 速度快,内存消耗小,安全性高

  • 元素均为相同类型,不能进行不同元素类型的混合

具体使用教程


TMap

  • 键值对(key-value)容器

  • 键(key)不能重复且唯一

具体使用教程


TSet

  • 快速容器类

  • 通常用在元素的排序不重要的情况下

  • 存储唯一元素

  • 使用数据值本身作为键

  • 非键值对存储方式

具体使用教程


属性说明符

UPROPERTY

名称

说明

VisibleDefaultsOnly

仅在类默认设置面板可见

VisibleInstanceOnly

仅在实例化细节面板可见

VisibleAnywhere

类默认设置和实例化细节面板都可见

EditDefaultsOnly

仅在类默认设置面板可编辑

EditInstanceOnly

仅在实例化细节面板可编辑

EditAnywhere

类默认设置和实例化细节面板都可编辑

BlueprintReadOnly

仅在蓝图中可读

BlueprintReadWrite

蓝图中可读写

BlueprintAssignable

蓝图可绑定

Category="分类1|分类1子分类"

分类名称


UFUNCTION

名称

说明

BlueprintCallable

蓝图可调用

BlueprintPure

纯虚函数

BlueprintImplementableEvent

蓝图实现定义,即C++声明,蓝图实现

BlueprintNativeEvent

蓝图可重载,即C++声明和实现, C++中的实现要在函数后面加上“_Implementation”

Category="分类1分类1子分类"

分类名称


UENUM

名称

说明

BlueprintType

蓝图类型,可在蓝图中使用


USTRUCT

名称

说明

BlueprintType

蓝图类型,可在蓝图中使用


元数据

UPROPERTY

名称

说明

DisplayName="显示名称"

蓝图、编辑器等显示名称

EditCondition="控制可否编辑的变量名称"

使用变量控制可否编辑

ToolTip="提示"

鼠标悬浮在变量上显示的提示

ExposeOnSpawn="ExposeOnSpawnValue"

蓝图生成时暴露


UFUNCTION

名称

说明

DisplayName="显示名称"

蓝图、编辑器等显示名称


实例化

UObject

class MHUONETWORK_API UHttpClient : public UObject{}
// 获得此类或子类模板类型
TSubclassOf<UHttpClient> SubHttpClientObject = UHttpClient::StaticClass();
// 实例化该类型
UHttpClient* HttpClient = NewObject<UHttpClient>(GetWorld(), SubHttpClientObject);

静态加载资源

static ConstructorHelpers::FObjectFinder<UStaticMesh> TempStaticMesh(
    TEXT("/Script/Engine.StaticMesh'/Game/LevelPrototyping/Meshes/SM_ChamferCube.SM_ChamferCube'"));
UStaticMesh* StaticMesh = TempStaticMesh.Object;

动态加载

// 资源
UStaticMesh* TempStaticMesh = LoadObject<UStaticMesh>(nullptr,
    TEXT("/Script/Engine.StaticMesh'/Game/LevelPrototyping/Meshes/SM_ChamferCube.SM_ChamferCube'"));
// 类
UClass* TempClass = LoadClass<AActor>(this,
                                     TEXT("/Script/Engine.Blueprint'/Game/Manager/MyActor.MyActor_C'"));

代理

  • 也叫做委托

  • 是提供一种消息机制,分为触发点(消息发送方)和执行点(消息接收方)


单播代理

宏定义在类上面

DECLARE_DELEGATE(NoParamDelegate); // 无参无返回值
DECLARE_DELEGATE_OneParam(OneParamDelegate, FString); // 1个参数无返回值
DECLARE_DELEGATE_TwoParams(TwoParamsDelegate, FString, int32); // 2个参数无返回值
DECLARE_DELEGATE_RetVal(FString, RetvalDelegate); // 无参有返回值
DECLARE_DELEGATE_RetVal_TwoParams(FString, RetTwoValsDelegate, FString, int32); // 2个参数有返回值

在类中声明

NoParamDelegate NoParamDelegate;
OneParamDelegate OneParamDelegate;
TwoParamsDelegate TwoParamsDelegate;
RetvalDelegate RetvalDelegate;
RetTwoValsDelegate RetTwoValsDelegate;

相应的函数声明

void NoParamFunc();
void OneParamFunc(FString str);
void TwoParamFunc(FString str, int32 value);
FString RetvalFunc();
FString RetTwoValsFunc(FString str, int32 value);

相应函数实现后,绑定到相应的代理

NoParamDelegate.BindUObject(this, &AMyActor::NoParamFunc);
RetvalDelegate.BindUObject(this, &AMyActor::RetvalFunc);

触发代理

bool bExecuteSuccess = NoParamDelegate.ExecuteIfBound();
bool bExecuteIfBound = OneParamDelegate.ExecuteIfBound("123");
FString RetVal = RetvalDelegate.Execute();

多播代理

  • 可以绑定多个函数

  • 没有可以返回值的宏定义

  • 除了宏定义和触发方式,其它与单播代理同理

宏定义

DECLARE_MULTICAST_DELEGATE(NoParamDelegate);
DECLARE_MULTICAST_DELEGATE_OneParam(OneParamDelegate, FString);
DECLARE_MULTICAST_DELEGATE_TwoParams(TwoParamsDelegate, FString, int32);

触发代理

TwoParamsDelegate.Broadcast("abcd", 2333);

动态多播代理

  • 可以暴露给蓝图,在蓝图中绑定事件

  • 没有可以返回值的宏定义

  • 代理名称要以F开头

  • 除了宏定义,其它与多播代理同理

宏定义

DECLARE_DYNAMIC_MULTICAST_DELEGATE(FNoParamDelegate);
//                                              代理名称         参数类型  参数名称
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOneParamDelegate, FString, str);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FTwoParamsDelegate, FString, str, int32, value);

引用

软引用

  • 仅存储资源对象的路径

  • 在需要的时候才会加载到内存中

  • 常见软引用类型

    • FSoftObjectPath

    • FSoftClassPath

    • TSoftObjectPtr

    • TSoftClassPtr


硬引用

  • 直接与资源对象产生耦合

  • 硬引用被加载到内存中,被引用的资源对象也被加载到内存中


智能指针库

  • 智能指针是虚幻实现的一套内存管理系统,即,程序员只管分配堆内存,释放内存交给智能指针

  • 智能指针只针对于派生自UObject的类对象

  • 智能指针库用以解决非UObject对象的内存管理

  • 智能指针库全平台通用


示例原生C++类

class my_class
{
public:
    int a,b;
​
    my_class() = default;
​
    my_class(int A, int B)
        : a(A),
          b(B)
    {
    }
};

共享指针(TSharedPtr)

  • 默认线程安全


初始化

右值初始化

TSharedPtr<my_class> SharedPtr(new my_class(114, 514));

拷贝构造函数初始化

TSharedPtr<my_class> SharedPtr(new my_class(114, 514));
TSharedPtr SharedPtr2(SharedPtr);

虚幻方法初始化

TSharedPtr<my_class> SharedPtr3 = nullptr;
SharedPtr3 = MakeShareable(new my_class(119, 888));

常用函数

有效对象判断
SharedPtr.IsValid()
唯一指针判断

当前共享指针是否为唯一指向指针里的对象的指针

SharedPtr.IsUnique()

共享引用(TSharedRef)

  • 初始化时必须指向一个有效的对象

初始化

TSharedRef<my_class> SharedRef(new my_class);

弱指针(TWeakPtr)

  • 解决了循环引用,只对弱指针保留引用权但不参与引用计数

  • 不能阻止对象被销毁,如果弱指针指向的对象被销毁,弱指针会自动清空

初始化

TSharedPtr<my_class> SharedPtr(new my_class);
TWeakPtr<my_class> WeakPtr(SharedPtr);

规则,就是用来打破的( ̄へ ̄)!