Blueprint —— C++的使用

目录

一,创建组件

二,调用重叠事件

三,创建数字资产

Primary Data Asset


      可仅使用蓝图、仅使用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()); }	
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值