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

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

蓝图类BPAActorChild:

C++类AActorChild的BeginPlay函数:

void AActorChild::BeginPlay()
{
Super::BeginPlay();
GEngine->AddOnScreenDebugMessage(-, 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(-, 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++类产生联系,还需要去看一下源码,了解生成宏的机制。

最新文章

  1. (十一)socket、connect、bind函数详解
  2. 20169212《Linux内核原理与分析》第十一周作业
  3. RC上电复位时间计算
  4. [游戏模版7] Win32 最简单贴图
  5. Android——AutoCompleteTextView、Spinner和消息提示
  6. TortoiseSVN 安装中文语言包,SVN中文语言包
  7. 致命错误: Python.h:没有那个文件或目录
  8. Openstack部署工具
  9. ofbiz安装优化
  10. oracle一视图性能问题
  11. jekyll bootstrap搭建github blog
  12. form表单传递下拉框的Value和Text值,不适用Jquery传递
  13. 用JS制作一个信息管理平台完整版
  14. Docker JDK镜像
  15. sai u 2016
  16. java基础 ---- 一维数组
  17. Navicat http 通道增加验证
  18. 【洛谷P4289】移动玩具 状压bfs
  19. web漏洞详解及修复建议
  20. IIS部署常见问题总结

热门文章

  1. Testlink研究小结
  2. MySQL left join操作中 on与where放置条件的区别
  3. javascript字符串属性及常用方法总结
  4. Java NIO 核心组件学习笔记
  5. 10.application对象
  6. JUnit【1】断言用法之assertEquals/True/False/ArrayEquals
  7. Agile&DevOps究竟谁是魔法棒
  8. MySQL(二)--事务与视图
  9. Java面试常考------------------------垃圾收集算法
  10. mybatis和spring整合