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

  • 相关阅读:
    ThinkJava-复用类
    ThinkJava-访问权限控制
    ElasticSearch 5.0及head插件安装
    安装Elasticsearch5.0 部署Head插件
    Elasticsearch 5.1.1 head插件安装指南
    使用logstash+elasticsearch+kibana快速搭建日志平台
    logstash使用操作部分
    ELK 集中日志分析 windows部署实战
    关于异步,同步,阻塞与非阻塞
    Zookeeper的集群配置和Java测试程序
  • 原文地址:https://www.cnblogs.com/AnKen/p/7074224.html
Copyright © 2011-2022 走看看