zoukankan      html  css  js  c++  java
  • UE4 C++BeginPlay And BlueprintBeginPlay

    今天遇到了一个诡异的问题,经过几个小时的煎熬终于找到了原因。mmmp

    如果有一个类AActorChild,这个AActorChild继承自AActor,再有一个蓝图类BPAActorChild。

    蓝图类BPAActorChild:

    C++类AActorChild的BeginPlay函数:

    void AActorChild::BeginPlay()
    {
        Super::BeginPlay();
        GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, TEXT("C++ BeginPlay"));
    }

    按照一般的思维肯定会认为运行后的结果是:1, C++ BeginPlay      ,2,BPBeginPlay。这么想的原因就是我的C++类继承Actor,然后蓝图类又继承自这个C++类,这样C++的BeginPlay调了父类的BeginPlay,蓝图又通过某种方式调C++类的。

    但是事实是相反的。运行出来的结果是:1,BPBeginPlay    2,C++ BeginPlay。

    然后继续做另一个测试,把C++类的BeginPlay改为如下:

    void AActorChild::BeginPlay()
    {
         GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, TEXT("C++ BeginPlay"));   
         Super::BeginPlay();
    }

    这样运行的结果就是:1,C++ BeginPlay      2,BPBeginPlay。

    这样看起来是蓝图的BeginPlay那一坨是跟着Super::BeginPlay()执行的。

    经过一番探索发现蓝图中的BeginPlay是从AActor的BeginPlay调用的,也就是Super::BeginPlay()这一行就有一部分是蓝图中BeginPlay的内容。把这一行去掉的话,AActor的BeginPlay就不会执行,自然蓝图中的BeginPlay也不会执行。

    所以就可以通过Super::BeginPlay()来指定自己的代码哪些需要在蓝图BeginPlay前,哪些在后。

    通过将蓝图复制粘贴出来看到以下信息:

        

    这个信息表明这个节点是直接继承的Actor,这样就可以解释这个奇怪的现象了,至于蓝图怎么跟继承的C++类产生联系,还需要去看一下源码,了解生成宏的机制。

  • 相关阅读:
    GateWay的简单使用
    SpringCloud项目注册到Nacos
    Hystrix整合Gateway
    Nginx配置socket.io集群
    windows搭建git服务
    解决gitLab上新建分支,idea中找不到对应分支问题
    mybatis mapper.xml的特殊操作符
    Chrome添加Axure RP插件
    idea Tomcat部署时没有update classes and resources
    缓存穿透,缓存击穿,缓存雪崩解决方案分析【转载】
  • 原文地址:https://www.cnblogs.com/litmin/p/7287123.html
Copyright © 2011-2022 走看看