虚幻C++中GENERATED_BODY() 与 GENERATED_UCLASS_BODY()

这两个宏封装了UE对象构造函数相关内容

它们的主要区别点是:继承父类之后,是否需要对父类的东西有所改动

GENERATED_BODY() 

表示我们不直接使用父类的构造函数,如果我们要在我们自定义的类中做一些初始化操作,需要我们自己在.h头文件中声明构造函数,然后在.cpp文件中实现该构造函数,它之后的成员的是private

GENERATED_UCLASS_BODY()

表示我们使用父类的构造,如果我们在在自定义类中做一些初始化操作,可以直接在.cpp文件中实现构造函数,而不需要在.h头文件中去声明,这个宏会自动生成带有特定参数的构造函数,它之后的成员是public

UHttpRequest::UHttpRequest(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)
{
    ...
}
### 如何在 Unreal Engine C++ 中使用 Template 模板(Template)是 C++ 的强大特性之一,在 Unreal Engine (UE) 编程中同样适用。通过模板,可以编写泛型代码来处理不同类型的对象而无需重复定义函数或类。 #### 定义模板函数 为了展示如何利用模板功能,下面是一个简单的例子,说明怎样创建一个能够接受任意类型参数并返回相同类型的值的通用函数: ```cpp // MyGenericLibrary.h #pragma once #include "CoreMinimal.h" template<typename T> T GetSameValue(T Value) { return Value; } ``` 此段代码展示了如何声明和实现一个名为 `GetSameValue` 的模板方法[^1]。它接收一个输入参数 `Value` 并将其原样返回给调用者。这里的 `<typename T>` 表明这是一个用于指定未知数据类型的占位符;当实际应用这个函数时,编译器会自动推断出具体的类型是什么。 #### 应用于 UE 类结构内 如果希望在一个继承自某个特定 UE 基础类的对象内部运用模板,则需要注意几点事项以确保兼容性和正确性。例如,假设有一个派生于 AActor 的 Actor 子类想要加入上述提到的功能: ```cpp // MyCustomActor.h #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "MyCustomActor.generated.h" UCLASS() class MYPROJECT_API AMyCustomActor : public AActor { GENERATED_BODY() public: // ...其他成员变量... template<typename T> void SetComponentVisibility(UStaticMeshComponent* Component, bool bNewVisibility); protected: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Mesh) class UStaticMeshComponent* StaticMeshComp; private: }; // MyCustomActor.cpp void AMyCustomActor::SetComponentVisibility(UStaticMeshComponent* Component, bool bNewVisibility) { if (!IsValid(Component)) { return; } Component->SetVisibility(bNewVisibility); } template<> float AMyCustomActor::GetSameValue<float>(float Value) { // 对于浮点数类型做特殊处理... return FMath::Abs(Value); // 返回绝对值作为示范操作 } ``` 这里不仅实现了之前介绍过的 `GetSameValue()` 函数特化版本,还增加了一个新的模板成员函数 `SetComponentVisibility<T>()` 来改变传入组件实例可见性的状态。值得注意的是,对于某些特殊情况下的重载,比如上面针对 float 类型的操作,可以通过显式特化的形式来进行定制化扩展[^2]。 #### 调用模板函数 最后一步是在适当的地方调用这些已经准备好的工具。这通常发生在事件响应或其他业务逻辑流程之中: ```cpp AMyCustomActor::BeginPlay() { Super::BeginPlay(); // 使用模板函数获取相同的整数值 int32 TestInt = 42; int32 ResultInt = GetSameValue(TestInt); // 特殊情况:传递浮点数将会触发我们先前定义的那个特化版 float TestFloat = -7.5f; float AbsResult = GetSameValue(TestFloat); // 设置静态网格体部件不可见 SetComponentVisibility<false>(StaticMeshComp); } ``` 这段脚本片段演示了如何分别对不同类型的数据执行相应的动作,并且证明即使面对不同的需求也可以灵活应对而不必每次都重新编码相似的过程[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值