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文件中写其实现即可

  • 相关阅读:
    IE8下网页中的视频会遮挡住顶层DIV的解决办法
    Synchronized 偏向锁、轻量级锁、自旋锁、锁消除
    Lock的使用
    Synchronized与ReentrantLock区别总结(简单粗暴,一目了然)
    Java线程池 面试题(精简)
    Java 线程池的认识和使用
    bat等大公司常考java多线程面试题
    Java面试题必备知识之ThreadLocal
    阿里面试题
    Spring中Bean的生命周期
  • 原文地址:https://www.cnblogs.com/AnKen/p/7074224.html
Copyright © 2011-2022 走看看