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++类产生联系,还需要去看一下源码,了解生成宏的机制。

  • 相关阅读:
    java实现冒泡排序
    使用telnet测试指定端口的连通性
    聊聊Java中的异常及处理
    Java工具类——数学相关的类
    谈谈javaSE中的==和equals的联系与区别
    如何在Vim中更改颜色和主题
    配置类为什么要添加@Configuration注解呢?
    你知道Spring是怎么解析配置类的吗?
    读源码,我们可以从第一行读起
    Spring杂谈 | Spring中的AutowireCandidateResolver
  • 原文地址:https://www.cnblogs.com/litmin/p/7287123.html
Copyright © 2011-2022 走看看