第 14 天:UE5 C++ 与蓝图(Blueprint)交互!

🎯 目标:

✅ 了解 C++ 与蓝图(Blueprint)交互的方式

✅ 在 C++ 中调用蓝图函数

✅ 让蓝图访问 C++ 变量和方法

✅ 使用 UFUNCTION、UPROPERTY 进行蓝图暴露

✅ 提高开发效率,让 C++ 和蓝图开发者高效协作

1️⃣ 为什么要让 C++ 与蓝图交互?

在 Unreal Engine 5 中,C++ 提供强大的底层逻辑,而 蓝图更适合快速调整游戏玩法。
C++ + 蓝图结合开发 = 既有性能,又有灵活性!
🚀

🎯 常见 C++ 与蓝图交互方式:

  1. C++ 定义变量 & 方法 → 蓝图访问 & 调用
  2. C++ 调用蓝图事件 & 函数
  3. C++ 创建蓝图子类
  4. 蓝图扩展 C++ 逻辑(继承 C++ 类)

2️⃣ 在 C++ 中暴露变量给蓝图

C++ 变量默认不可在蓝图中访问,需要使用 UPROPERTY() 暴露给蓝图。

🔹 修改 PlayerCharacter.h

📌 让变量 Health 可以被蓝图访问

cpp 复制代码
#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 面板归类

🔹 在蓝图中访问变量

  1. 打开 UE5,找到 PlayerCharacter

  2. 右键PlayerCharacter 选择Create Blueprint Class Based on PlayerCharacter(创建基于PlayerCharacter的蓝图类)

  3. 命名BP_PlayerCharacter,双击打开BP_PlayerCharacter

  4. 在 Details 面板修改 Health

  5. 在 Event Graph 里读取 Health 并打印出来

现在蓝图可以访问 C++ 变量了!

3️⃣ 在 C++ 中暴露方法给蓝图

🔹 修改 PlayerCharacter.h

📌 让 TakeDamage() 方法可被蓝图调用

cpp 复制代码
UFUNCTION(BlueprintCallable, Category = "Character Actions")
void TakeDamage(float DamageAmount);

🔹 修改 PlayerCharacter.cpp

📌 实现 TakeDamage() 方法

cpp 复制代码
#include "PlayerCharacter.h"

APlayerCharacter::APlayerCharacter()
{
    Health = 100.0f;
}

void APlayerCharacter::TakeDamage(float DamageAmount)
{
    Health -= DamageAmount;
    UE_LOG(LogTemp, Warning, TEXT("玩家受伤,当前血量:%f"), Health);
}

🔹 在蓝图中调用方法

  1. 在 PlayerCharacter 蓝图中,右键搜索 TakeDamage
  2. 连接 Event AnyKey 到 TakeDamage(10.0f)
  3. 运行游戏,按键后,观察输出日志

现在蓝图可以调用 C++ 方法了!

4️⃣ C++ 调用蓝图事件

有时候,我们希望在 C++ 中调用蓝图实现的功能,比如播放 UI 效果、生成特效等

🔹 在 C++ 定义 BlueprintImplementableEvent

📌 让蓝图实现 OnHealthChanged() 事件

cpp 复制代码
UFUNCTION(BlueprintImplementableEvent, Category = "Character Events")
void OnHealthChanged();

🔹 在 TakeDamage() 触发蓝图事件

📌 修改 TakeDamage(),调用 OnHealthChanged()

cpp 复制代码
void APlayerCharacter::TakeDamage(float DamageAmount)
{
    Health -= DamageAmount;
    UE_LOG(LogTemp, Warning, TEXT("玩家受伤,当前血量:%f"), Health);

    OnHealthChanged();  // 触发蓝图事件
}

🔹 在蓝图实现 OnHealthChanged()

  1. 打开 BP_PlayerCharacter 蓝图
  2. 在 Event Graph 里找到 OnHealthChanged
  3. 打印Health

现在 C++ 可以调用蓝图事件了!

5️⃣ 让蓝图继承 C++ 类

🔹 在 C++ 创建一个可继承的 Weapon 类

📌 Weapon.h

cpp 复制代码
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Weapon.generated.h"

UCLASS(Blueprintable)
class MYGAME_API AWeapon : public AActor
{
    GENERATED_BODY()
};

📌 Blueprintable 让蓝图可以继承该类

🔹 在蓝图创建 Weapon 子类

  1. 在 UE5 Content Browser,右键 Weapon 类
  2. 选择 Create Blueprint Class Based on Weapon(创建基于Weapon的蓝图类)
  3. 命名为BP_Weapon
  4. 为 BP_Weapon 添加模型 & 逻辑
  5. 拖到关卡中使用

✅ 现在蓝图可以继承 C++ 代码,扩展游戏逻辑!

6️⃣ C++ 调用蓝图函数

📌 如果蓝图中有 Fire() 方法,C++ 也可以调用

cpp 复制代码
UFUNCTION(BlueprintCallable, Category = "Weapon")
void Fire();

📌 在 C++ 调用蓝图中的 Fire()

cpp 复制代码
if (Weapon)
{
    Weapon->Fire();
}

现在 C++ 可以调用蓝图方法了!

🎯 总结

✅ C++ 变量 & 方法暴露给蓝图(UPROPERTY()、UFUNCTION())

✅ C++ 触发蓝图事件(BlueprintImplementableEvent)

✅ 蓝图继承 C++ 类,扩展游戏逻辑(Blueprintable)

✅ C++ 可以调用蓝图的函数(BlueprintCallable)

🎮 **C++ + 蓝图结合开发,让游戏既高效又强大!**🚀

相关推荐
Reese_Cool21 分钟前
【有外界干扰的BFS】经典题P2895Meteor Shower S
数据结构·c++·算法·蓝桥杯·宽度优先
BC橡木43 分钟前
C++迭代器(iterator)
c++
源码宝1 小时前
【PACS源码】PACS数字医学影像信息系统,影像数据管理、图像处理、海量数据存储与检索
c++·影像系统·pacs·pacs源码·数据储存·影像后处理·影像工作站
程序员yt1 小时前
双非一本毕业测试工作一年想转C++开发,嵌入式Linux与音视频方向哪个方向更合适?
linux·c++·音视频
Java展博1 小时前
[特殊字符] 2025蓝桥杯备赛Day13——P10984 [蓝桥杯 2023 国 Python A] 残缺的数字
c++·python·算法·蓝桥杯
今麦郎xdu_2 小时前
【STL】vector
数据结构·c++·算法·stl
y198759982 小时前
C++代码脚本实现STM32启动
c++·stm32·嵌入式硬件
Watink Cpper2 小时前
[C++] 智能指针 进阶
开发语言·c++·指针·智能指针·模拟实现·raii·资源获取即初始化
我不是代码教父2 小时前
[原创](现代C++ Builder 12指南): 再谈如何使用System.JSON?附加代码示例更加详细
c++·json·c++ builder 12·c++ builder
_GR3 小时前
C/C++后端开发面经
c语言·开发语言·c++