• UE4-蓝图与C++类 互相调用函数


    • UE4-蓝图与C++类 互相调用函数
    • Time: 2020年10月15日10:13:15
    • Author: Yblackd

    @


    1. 准备工作

    1.1 基于C++创建的Actor类 创建蓝图类

    ​ 根据 MyActor_First 类创建新的 蓝图类->BP_First。

    • 内容浏览器 视图中,点击 Add New 按钮 或者单击 右键 ,然后选择 Blueprint Class。如下图Create_BP

    Create_BP

    • 在弹出的窗口中最下方,点击 All Class, 在搜索框中输入 MyActor_First ,然后选中我们自己创建的 MyActor_First 类,并且点击 Select 按钮,创建成功后,重命名为 BP_First

    Create_BP2

    2 创建C++函数蓝图调用

    • 创建C++函数,并且公开给蓝图
    // 头文件中声明函数
    UFUNCTION(BlueprintCallable, Category = "BPFunc_Lib")
        void CppPrint();
    /*
    	和公开属性类似,使用宏 UFUNCTION 即可。UFUNCTION() 负责将C++函数公开给反射系统。**BlueprintCallable ** 选项将其公开给蓝图虚拟机。每一个公开给蓝图的函数都需要一个与之关联的类别(Category),这样右键点击快捷菜单的功能才能正确生效。
    	双击我们的 MyActor_First  蓝图类,打开蓝图编辑器。在空白处单击右键,在弹出的列表中即可找到我们公开给蓝图的C++函数。如下图:BPCallable_CFunc
    */
    

    BPCallable_CFunc

    • 在cpp文件中实现 CppPrint() 函数代码如下,保存并且编译。
    // cpp文件中定义函数
    void MyActor_First::CppPrint()
    {
        GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("Test BP Callable C++ Func!")));
    }
    
    • BP_First 拖拽到关卡编辑器中,点击 Compile编译和PlayPlay运行, 注意游戏窗口的左上角,有红色的 Test BP Callable C++ Func! 字样。

    3. 创建蓝图函数C++调用

    • 在头文件中声明函数,使用说明符 BlueprintImplementableEvent(蓝图可执行事件) 即可,该函数不需要在C++类中实现。
      • 对比BlueprintPure修饰符:BlueprintImplementableEvent在蓝图中被当做事件调用,BlueprintPure被当做函数调用。
    UFUNCTION(BlueprintImplementableEvent, Category = "BP_Funclib")
    	void BPPrint();
    
    • 在蓝图编辑器中打开 BP_First ,在空白处点击右键,搜索 BPPrint,选择 Event BPPrint,如下图:

    Event_BPPrintFunc

    • 补充Event BPPrint功能,点击编译。如下图:

    Event_BPPrintFunc2

    • 在C++调用BPPrint函数

      在C++中CppPrint函数中调用BPPrint函数,运行结果: 先输出红色Test BP Callable C++ Func!, 在输出蓝色Hello World

      void AMyActor_First::CppPrint()
      {
      	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("Test BP Callable C++ Func!")));
      	BPPrint();
      }
      
    • 这种函数的调用方法与任何其他的C++函数没有区别。虚幻引擎会在其内部自动生成C++函数的基本实现,该实现了解如何调用蓝图VM。这通常称为形实替换。如果对应的蓝图没有实现该函数,则函数行为就像C++空函数体一样,不执行任何操作。如果想要提供C++函数的默认实现,同时仍允许蓝图覆盖此函数,则需要另一个说明符 BlueprintNativeEvent。该说明符仍会自动生成C++函数的基本实现,但是同时还会生成一个新的函数声明,类似于<函数名>_Implementation()。必须实现该函数,否则项目无法建立联接。声明与实现如下:

    UFUNCTION(BlueprintNativeEvent, Category = "BPFunc_Lib")
    		void BPPrint1();
    
    void AMyFirstActor::BPPrint1_Implementation()
    {
    	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("C++ Default Print")));
    }
    

    4. 参考

    参考链接:https://blog.csdn.net/u011476173/article/details/97927230

  • 相关阅读:
    测试平台系列(69) 数据构造器支持sql语句
    Selenium获取动态图片验证码
    测试平台系列(68) 解决数据驱动带来的麻烦
    测试平台系列(67) 玩转数据驱动
    3班6组项目测试心得
    3班6组第一次迭代博客
    需求分析心得
    数据库设计心得
    结对编程总结
    代码欣赏
  • 原文地址:https://www.cnblogs.com/yblackd/p/13819045.html
Copyright © 2020-2023  润新知