zoukankan      html  css  js  c++  java
  • 跨 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文件中写其实现即可

  • 相关阅读:
    跨浏览器的事件处理程序(javascript高级程序设计第二版第十二章)
    json
    html5 本地存储Web Storage
    sicily 6497. 字符统计
    sicily 6415. linear correlation
    sicily 1154. Easy sort
    sicily 6496. 二维数组
    sicily 6423. 反向输出数字
    sicily 1636. show me the money
    sicily 1324. Score
  • 原文地址:https://www.cnblogs.com/AnKen/p/7074224.html
Copyright © 2011-2022 走看看