UE4 C++BeginPlay And BlueprintBeginPlay
今天遇到了一个诡异的问题,经过几个小时的煎熬终于找到了原因。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++类产生联系,还需要去看一下源码,了解生成宏的机制。
最新文章
- (十一)socket、connect、bind函数详解
- 20169212《Linux内核原理与分析》第十一周作业
- RC上电复位时间计算
- [游戏模版7] Win32 最简单贴图
- Android——AutoCompleteTextView、Spinner和消息提示
- TortoiseSVN 安装中文语言包,SVN中文语言包
- 致命错误: Python.h:没有那个文件或目录
- Openstack部署工具
- ofbiz安装优化
- oracle一视图性能问题
- jekyll bootstrap搭建github blog
- form表单传递下拉框的Value和Text值,不适用Jquery传递
- 用JS制作一个信息管理平台完整版
- Docker JDK镜像
- sai u 2016
- java基础 ---- 一维数组
- Navicat http 通道增加验证
- 【洛谷P4289】移动玩具 状压bfs
- web漏洞详解及修复建议
- IIS部署常见问题总结