🎯 目标:
✅ 了解 C++ 与蓝图(Blueprint)交互的方式
✅ 在 C++ 中调用蓝图函数
✅ 让蓝图访问 C++ 变量和方法
✅ 使用 UFUNCTION、UPROPERTY 进行蓝图暴露
✅ 提高开发效率,让 C++ 和蓝图开发者高效协作
1️⃣ 为什么要让 C++ 与蓝图交互?
在 Unreal Engine 5 中,C++ 提供强大的底层逻辑,而 蓝图更适合快速调整游戏玩法。
C++ + 蓝图结合开发 = 既有性能,又有灵活性! 🚀
🎯 常见 C++ 与蓝图交互方式:
- C++ 定义变量 & 方法 → 蓝图访问 & 调用
- C++ 调用蓝图事件 & 函数
- C++ 创建蓝图子类
- 蓝图扩展 C++ 逻辑(继承 C++ 类)
2️⃣ 在 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++ 变量了!
3️⃣ 在 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++ 方法了!
4️⃣ 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++ 可以调用蓝图事件了!
5️⃣ 让蓝图继承 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()
};
📌 Blueprintable 让蓝图可以继承该类
🔹 在蓝图创建 Weapon 子类
- 在 UE5 Content Browser,右键 Weapon 类
- 选择 Create Blueprint Class Based on Weapon(创建基于Weapon的蓝图类)
- 命名为BP_Weapon
- 为 BP_Weapon 添加模型 & 逻辑
- 拖到关卡中使用
✅ 现在蓝图可以继承 C++ 代码,扩展游戏逻辑!
6️⃣ 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++ + 蓝图结合开发,让游戏既高效又强大!**🚀