UE5 C++与蓝图交互完全指南:从变量暴露到事件触发
创作时间:
作者:
@小白创作中心
UE5 C++与蓝图交互完全指南:从变量暴露到事件触发
引用
CSDN
1.
https://blog.csdn.net/m0_37643873/article/details/145626869
在Unreal Engine 5(UE5)开发中,C++和蓝图(Blueprint)是两种重要的开发方式。C++提供强大的底层逻辑,而蓝图则更适合快速调整游戏玩法。将两者结合使用,可以充分发挥各自的优点,实现既有性能又有灵活性的开发模式。本文将详细介绍C++与蓝图之间的各种交互方式,帮助开发者更好地利用这两种开发工具。
目标
- 了解C++与蓝图交互的方式
- 在C++中调用蓝图函数
- 让蓝图访问C++变量和方法
- 使用
UFUNCTION
、UPROPERTY
进行蓝图暴露 - 提高开发效率,让C++和蓝图开发者高效协作
为什么要让C++与蓝图交互?
在Unreal Engine 5中,C++提供强大的底层逻辑,而蓝图更适合快速调整游戏玩法。C++ + 蓝图结合开发 = 既有性能,又有灵活性!
常见C++与蓝图交互方式
- C++定义变量 & 方法 → 蓝图访问 & 调用
- C++调用蓝图事件 & 函数
- C++创建蓝图子类
- 蓝图扩展C++逻辑(继承C++类)
在C++中暴露变量给蓝图
C++变量默认不可在蓝图中访问,需要使用UPROPERTY()
暴露给蓝图。
修改PlayerCharacter.h
让变量Health
可以在蓝图中访问:
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "PlayerCharacter.generated.h"
UCLASS()
class MYGAME_API APlayerCharacter : public ACharacter
{
GENERATED_BODY()
public:
APlayerCharacter();
protected:
virtual void BeginPlay() override;
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Character Stats")
float Health;
};
变量暴露给蓝图的关键词
EditAnywhere
:在蓝图编辑器可修改BlueprintReadWrite
:在蓝图中可读写Category="xxx"
:让变量在Details面板归类
在蓝图中访问变量
- 打开UE5,找到
PlayerCharacter
- 右键
PlayerCharacter
选择Create Blueprint Class Based on PlayerCharacter
(创建基于PlayerCharacter
的蓝图类) - 命名
BP_PlayerCharacter
,双击打开BP_PlayerCharacter
- 在Details面板修改
Health
- 在Event Graph里读取
Health
并打印出来
现在蓝图可以访问C++变量了!
在C++中暴露方法给蓝图
修改PlayerCharacter.h
让TakeDamage()
方法可被蓝图调用:
UFUNCTION(BlueprintCallable, Category = "Character Actions")
void TakeDamage(float DamageAmount);
修改PlayerCharacter.cpp
实现TakeDamage()
方法:
#include "PlayerCharacter.h"
APlayerCharacter::APlayerCharacter()
{
Health = 100.0f;
}
void APlayerCharacter::TakeDamage(float DamageAmount)
{
Health -= DamageAmount;
UE_LOG(LogTemp, Warning, TEXT("玩家受伤,当前血量:%f"), Health);
}
在蓝图中调用方法
- 在
PlayerCharacter
蓝图中,右键搜索TakeDamage
- 连接
Event AnyKey
到TakeDamage(10.0f)
- 运行游戏,按键后,观察输出日志
现在蓝图可以调用C++方法了!
C++调用蓝图事件
有时候,我们希望在C++中调用蓝图实现的功能,比如播放UI效果、生成特效等。
在C++定义BlueprintImplementableEvent
让蓝图实现OnHealthChanged()
事件:
UFUNCTION(BlueprintImplementableEvent, Category = "Character Events")
void OnHealthChanged();
在TakeDamage()
触发蓝图事件
修改TakeDamage()
,调用OnHealthChanged()
:
void APlayerCharacter::TakeDamage(float DamageAmount)
{
Health -= DamageAmount;
UE_LOG(LogTemp, Warning, TEXT("玩家受伤,当前血量:%f"), Health);
OnHealthChanged(); // 触发蓝图事件
}
在蓝图实现OnHealthChanged()
- 打开
BP_PlayerCharacter
蓝图 - 在Event Graph里找到
OnHealthChanged
- 打印Health
现在C++可以调用蓝图事件了!
让蓝图继承C++类
在C++创建一个可继承的Weapon
类
Weapon.h
:
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Weapon.generated.h"
UCLASS(Blueprintable)
class MYGAME_API AWeapon : public AActor
{
GENERATED_BODY()
};
在蓝图创建Weapon
子类
- 在UE5 Content Browser,右键
Weapon
类 - 选择
Create Blueprint Class Based on Weapon
(创建基于Weapon
的蓝图类) - 命名为
BP_Weapon
- 为
BP_Weapon
添加模型 & 逻辑 - 拖到关卡中使用
现在蓝图可以继承C++代码,扩展游戏逻辑!
C++调用蓝图函数
如果蓝图中有Fire()
方法,C++也可以调用:
UFUNCTION(BlueprintCallable, Category = "Weapon")
void Fire();
在C++调用蓝图中的Fire()
:
if (Weapon)
{
Weapon->Fire();
}
现在C++可以调用蓝图方法了!
总结
- C++变量 & 方法暴露给蓝图(
UPROPERTY()
、UFUNCTION()
) - C++触发蓝图事件(
BlueprintImplementableEvent
) - 蓝图继承C++类,扩展游戏逻辑(
Blueprintable
) - C++可以调用蓝图的函数(
BlueprintCallable
)
C++ + 蓝图结合开发,让游戏既高效又强大!
热门推荐
人参果的营养价值与食用指南:从功效到搭配全解析
临床医学专业是否值得报考?全面解析其利弊
敏感肌卸妆的选择:温和不刺激的有效成分
重用(导入)其他演示文稿中的幻灯片
氮化硼“四兄弟”:结构、性能与应用全解析
of和for区别
《黑神话·悟空》的技术揭秘:C++与虚幻引擎如何打造中国首款3A大作
晾衣架是手摇的好还是电动的好?选择指南
十二生肖的迷人起源揭晓
降压药应该啥时候吃?早晨、中午还是晚上?
盐铁论:一场两千年前的“经济辩论”,到底在吵啥?
PCCTA在冠脉狭窄评估中的价值
10 个动画速度最快的动漫角色排名
临床必备 | 一文读懂过敏性鼻炎:从发病到防治
更换一个C级锁芯多少钱
合同主体需要具备哪些资格条件?
《水浒传》名字的背后:英雄集结的命名艺术与文化深意
个人成长与共同兴趣,点亮婚姻幸福
严世蕃:权倾一时的奸臣之子
反恐精英哪个探员好
2025年中国飞行汽车/eVTOL发展前景研究报告
高三生物怎么学,成绩提升的策略有哪些?
降压药新分11类,前6大类最常用
基因编辑探秘系列之原理篇
笔记本电脑购买指南:从需求分析到选购时机的全方位攻略
AI摄影:打造高效摄影师工作流的革新之路
红酒初学者指南:10个必知的基础小知识
感情内耗?学会这几招,重获幸福!
肠癌出血和痔疮出血有什么区别
芥菜是什么菜营养价值有哪些(聊一聊芥菜的营养小知识)