跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

UE5 蓝图与 C++ 交互:组件、事件与数据资产

综述由AI生成在 Unreal Engine 中使用 C++ 与蓝图交互的三种主要方式。首先讲解了如何创建组件,对比了原始指针与 TObjectPtr 智能指针的区别及 CreateDefaultSubobject 用法。其次演示了如何通过 BlueprintNativeEvent 实现重叠事件的 C++ 默认实现与蓝图重写机制。最后阐述了基于 DataAsset 和 PrimaryDataAsset 创建数字资产的方法及代码结构。内容涵盖头文件声明、构造函数初始化及属性宏定义等关键步骤。

星星泡饭发布于 2026/3/23更新于 2026/5/2326K 浏览

一、创建组件

以 PointLight 组件为例;

UPointLightComponent*,表示原始的 C++ 指针;轻量级,直接存储对象的内存地址;不提供额外的内存管理或安全性检查;需手动管理对象的生命周期(如确保指针不为空);

TObjectPtr,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());
}
};

文章配图

目录

  1. 一、创建组件
  2. 二、调用重叠事件
  3. 三、创建数字资产
  4. Primary Data Asset
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Ubuntu 22.04 虚拟机网络故障排查与修复
  • RAG 检索优化与进阶算法:性能提升
  • Qwen3-4B 模型部署与写作应用指南
  • 多旋翼物流无人机节能轨迹规划及 Python 实现
  • 从零开始学 Python 第 11 课:常用数据结构之字符串
  • 区块链是什么:Web3 底层的分布式信任技术
  • Ascend C 算子开发指南:从语法基础到算子实操
  • 前端权限管理实现方案与最佳实践
  • 深入解析 π₀ 与 π₀.5:Physical Intelligence 的机器人基础模型演进
  • Windows 部署 OpenClaw 构建本地 AI 助手教程
  • GitHub Copilot 安装与使用指南
  • 灵感画廊 AI 绘画工具安装与使用教程
  • Python 调用高德地图 MCP 服务查询天气示例
  • 使用 Conda 创建 Python 3.10 虚拟环境
  • 2020 年 CSP-S 提高组初赛阅读程序题解析(C++)
  • Dify 前端样式修改与自定义 Docker 镜像构建指南
  • Llama 3-8B-Instruct 在昇腾 NPU 上的 SGLang 性能实测
  • FPGA 设计实战:CAN 总线原理与 Verilog 实现
  • C++ STL 标准库算法详解
  • AppScan Web 安全扫描工具使用指南

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online