• 跨 C++ 和蓝图边界调用函数


    (主要内容来自官方文档,加入了一些自己的理解)

    下面都假设C++中有个函数名称为SomeFunction.

    • C++调用蓝图函数:

    在C++函数声明前加入BlueprintImplementableEvent标签,则SomeFunction在蓝图中以事件的方式出现,可以调用该事件。

    UFUNCTION(BlueprintImplementableEvent, Category="SomeCategory")
    void SomeFunction();

    注意,该函数在C++中不能有实现(定义),不然编译会报错。

    这种跨边界调用方式的意义在于:可以在C++中其他位置调用一个目前没有任何功能的函数(事件),而该函数的具体实现交给使用蓝图的设计师来决定。

    • 给上述的函数添加默认的C++实现:

    要想添加默认的C++实现,就不能使用BlueprintImplementableEvent标签,而是对该函数使用BlueprintNativeEvent,另外,需要手动再添加一个函数声明,函数名称有固定的格式:SomeFunction_Implementation。

    SomeFunction不能有实现(定义),SomeFunction_Implementation必须有实现(定义)。

        //.h文件********************************
    
        UFUNCTION(BlueprintNativeEvent, Category = "SomeCategory")
            void SomeFunction();
    
        void SomeFunction_Implementation();
    
    
        //.cpp文件********************************
    
        void AMyActor::SomeFunction_Implementation()
        {
            UE_LOG(LogTemp, Warning, TEXT("Implenetaion in C++"));
        }
    
        //在Tick中调用SomeFunction(),会自动优先调用Somefunction_Implementation()
        void AMyActor::Tick(float DeltaTime)
        {
            Super::Tick(DeltaTime);
            SomeFunction();
        }

    调用方式:在调用了SomeFunction()的地方有限调用SomeFunction_Implementation的实现,但如果在蓝图中定义了SomeFunction事件(即在蓝图的SomeCategory分类中选择Event Some Function事件,即使后面不连接任何内容),则会忽略SomeFunction_Implementation中的实现,只采用蓝图中的实现。

    阅读引擎源代码发现SomeFunction_Implementation也可以不需要声明,直接在CPP文件中写其实现即可

  • 相关阅读:
    竞赛备考建议
    谷山丰的一生
    从首个IMO季军谈起 作者 : 付云皓
    孔庆东:单刀赴高考
    LaTeX 技巧 802:国内期刊 CCT 模板编译经验
    数学书籍推荐
    翻译
    printf中用法详解
    黎活明给程序员的忠告【转】
    log4j2配置文件log4j2.xml详解(转载)
  • 原文地址:https://www.cnblogs.com/AnKen/p/7074224.html
Copyright © 2020-2023  润新知