问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

UE5 C++与蓝图交互完全指南

创作时间:
作者:
@小白创作中心

UE5 C++与蓝图交互完全指南

引用
CSDN
1.
https://blog.csdn.net/m0_37643873/article/details/145626869

在Unreal Engine 5中,C++与蓝图(Blueprint)的交互是游戏开发中的重要环节。本文将详细介绍如何实现C++与蓝图的交互,包括在C++中暴露变量和方法给蓝图,以及如何让蓝图访问C++变量和调用C++方法。此外,还将介绍C++调用蓝图事件和函数的方法,以及蓝图继承C++类的方式。

目标

  • 了解C++与蓝图(Blueprint)交互的方式
  • 在C++中调用蓝图函数
  • 让蓝图访问C++变量和方法
  • 使用UFUNCTION、UPROPERTY进行蓝图暴露
  • 提高开发效率,让C++和蓝图开发者高效协作

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

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

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

  1. C++定义变量 & 方法 → 蓝图访问 & 调用
  2. C++调用蓝图事件 & 函数
  3. C++创建蓝图子类
  4. 蓝图扩展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面板归类

在蓝图中访问变量

  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++变量了!

在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);
}

在蓝图中调用方法

  1. 在PlayerCharacter蓝图中,右键搜索TakeDamage
  2. 连接Event AnyKey到TakeDamage(10.0f)
  3. 运行游戏,按键后,观察输出日志
    现在蓝图可以调用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()

  1. 打开BP_PlayerCharacter蓝图
  2. 在Event Graph里找到OnHealthChanged
  3. 打印Health
    现在C++可以调用蓝图事件了!

让蓝图继承C++类

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

Weapon.h

#pragma once
#include "CoreMinimal.h"
![](https://wy-static.wenxiaobai.com/chat-rag-image/4189548411918777831)
#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++代码,扩展游戏逻辑!

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++ + 蓝图结合开发,让游戏既高效又强大!
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号