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

  • 相关阅读:
    SpringMVC源码分析--HandlerMappings
    你真的懂wait、notify和notifyAll吗
    深入理解DefaultMessageListenerContainer
    起步
    ZOJ 3827 Information Entropy (2014牡丹江区域赛)
    Spring简化配置
    对于一个IE8兼容性问题的反思
    xcode7.1.1不能真机调试ios9.2系统设备的解决方法
    CSS3怎样实现超出指定文本以省略号显示效果
    网易2016年研发project师编程题(2)
  • 原文地址:https://www.cnblogs.com/litmin/p/7287123.html
Copyright © 2011-2022 走看看