目录
可仅使用蓝图、仅使用C++代码、以及同时使用C++代码和蓝图创建新类;
一,创建组件
以PointLight组件为例;
UPointLightComponent*,表示原始的C++指针;
- 轻量级,直接存储对象的内存地址;
- 不提供额外的内存管理或安全性检查;
- 需手动管理对象的生命周期(如确保指针不为空);
TObjectPtr<UPointLightComponent>,TObjectPtr<T>是 UE 5.0 引入的一种智能指针类型,专门用于指向UObject派生类;
- 提供了额外的安全性和功能,自动处理对象的加载和卸载,支持弱引用(Weak Reference),避免循环引用导致的内存泄漏,在调试模式下提供额外的检查,帮助捕获悬空指针等问题;
- 与 UE 的资源管理系统集成,支持异步加载和垃圾回收;
- 比原始指针稍重,但提供了更高的安全性;
CreateDefaultSubobject,用于在 Actor 的构造函数中创建并初始化子对象(Subobject),如 Component ;也是 UE 对象系统的一部分,确保子对象能够正确地被 UE 管理和序列化;
Specifiers 控制变量行为的说明符:
VisibleAnywhere,变量在编辑器中可见,但不能编辑;
EditAnywhere,变量在编辑器中可见且可编辑
BlueprintReadOnly,变量在蓝图中只读,不能修改;
BlueprintReadWrite,变量在蓝图中可读可写;
Category,将变量分组到指定的类别,方便查找;
meta=(AllowPrivateAccess=true),允许蓝图访问私有变量;
//TestActor.h
#include "Components/PointLightComponent.h"
...
public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "VALUE")
class UPointLightComponent* pointlight; //class表示为类型,可省略
//或
TObjectPtr<UPointLightComponent> pointlight;
...
//TestActor.cpp
...
pointlight = CreateDefaultSubobject<UPointLightComponent>(TEXT("pointlight"));
...
二,调用重叠事件
UFUNCTION(BlueprintNativeEvent),蓝图原生事件;
- 允许在 C++ 中实现一个函数且同时在蓝图中重写该函数;
- C++ 中的实现是默认实现,蓝图中的实现是可选的;
- 如蓝图中重写了该函数,调用时会执行蓝图的实现;否则,调用 C++ 的实现;
_Implementation,是
BlueprintNativeEvent函数的默认实现;
如蓝图中没有重写该函数,调用时会执行此实现;
函数名必须与声明函数名一致,并加上
_Implementation后缀;
SetupAttachment 用于将组件附加到另一个组件上的函数;
- 可建立组件间的父子关系,形成层级结构;子组件的变换是相对于父组件的;
- 父组件是
nullptr,子组件会成为根组件(RootComponent);
OnComponentBeginOverlap.AddDynamic,用于将一个函数绑定到组件的
OnComponentBeginOverlap事件上,当组件与其他组件发生重叠时,绑定的函数会被调用;
- 与其他组件发生重叠时触发,适用于碰撞检测;
- 重叠的双方都必须启用
Generate Overlap Events;
//TestActor.cpp
ATestActor::ATestActor()
{
PrimaryActorTick.bCanEverTick = true;
pointlight = CreateDefaultSubobject<UPointLightComponent>(TEXT("mypointlight"));
sphere = CreateDefaultSubobject<USphereComponent>(TEXT("mysphere"));
sphere->SetupAttachment(pointlight);
sphere->InitSphereRadius(250.0f);
sphere->OnComponentBeginOverlap.AddDynamic(this, &ATestActor::OnOverlapBegin);
sphere->OnComponentEndOverlap.AddDynamic(this, &ATestActor::OnOverlapEnd);
}
//进入组件时调用
UFUNCTION(BlueprintNativeEvent, Category = "Switch Functions")
void OnOverlapBegin(class UPrimitiveComponent* OverlappedComp,
class AActor* OtherActor,
class UPrimitiveComponent* OtherComp,
int32 OtherBodyIndex, bool bFromSweep,
const FHitResult& SweepResult);
void OnOverlapBegin_Implementation(class UPrimitiveComponent* OverlappedComp,
class AActor* OtherActor,
class UPrimitiveComponent* OtherComp,
int32 OtherBodyIndex, bool bFromSweep,
const FHitResult& SweepResult);
//离开组件时调用
UFUNCTION(BlueprintNativeEvent, Category="Switch Functions")
void OnOverlapEnd(class UPrimitiveComponent* OverlappedComp,
class AActor* OtherActor,
class UPrimitiveComponent* OtherComp,
int32 OtherBodyIndex);
void OnOverlapEnd_Implementation(class UPrimitiveComponent* OverlappedComp,
class AActor* OtherActor,
class UPrimitiveComponent* OtherComp,
int32 OtherBodyIndex);

三,创建数字资产
- 使用 New C++ Class ,基于 DataAsset 创建新类;
- 在头文件内,添加指定的数据成员,并编译;
- 在 Content Browser 内,创建基于C++数据资产的实例(Miscellaneous > Data Asset);

//添加类数据成员代码
USTRUCT()
struct FMyAssetInfo
{
GENERATED_BODY()
UPROPERTY(EditAnywhere)
FString AssetName;
UPROPERTY(EditAnywhere)
UTexture2D* AssetThumbnail;
UPROPERTY(EditAnywhere)
UStaticMesh* AssetStaticMesh;
};
UCLASS()
class MYPROJECT_API UMyDataAsset : public UDataAsset
{
GENERATED_BODY()
UPROPERTY(EditAnywhere)
TArray<FMyAssetInfo> AssetItems;
};
Primary Data Asset
- 使用 New C++ Class ,基于 PrimaryDataAsset 创建新类;
- 在头文件内,添加指定的数据成员并重载 GetPrimaryAssetID 函数,并编译;
- 在 Content Browser 内,创建基于C++数据资产的实例(Miscellaneous > Data Asset);

UCLASS()
class MYPROJECT_API UMyPrimaryDataAsset : public UPrimaryDataAsset
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, Category = "Asset")
FString AssetName;
UPROPERTY(EditAnywhere, Category = "Asset")
UTexture2D* AssetThumbnail;
UPROPERTY(EditAnywhere, Category = "Asset")
UStaticMesh* AssetStaticMesh;
virtual FPrimaryAssetId GetPrimaryAssetId() const override { return FPrimaryAssetId("AssetItems", GetFName()); }
};


970

被折叠的 条评论
为什么被折叠?



