上一章虚幻引擎接口中 用到了这三种函数
这章节进行详细解释
被BlueprintNativeEvent和BlueprintImplementableEvent修饰的函数被称为蓝图可实现函数
即可以在蓝图中实现
不过函数若想在蓝图中调用 还要加上BlueprintCallable
virtual void Say1() const = 0;
//UFUNCTION(BlueprintCallable,BlueprintNativeEvent)
//void Say2();
//UFUNCTION(BlueprintCallable,BlueprintImplementableEvent)
//void Say3();
1.纯虚函数
virtual void Say1() const = 0;
c++原生的纯虚函数 要求函数必须在子类c++中实现
带有纯虚函数的类不能实例化
2.BlueprintImplementableEvent
表示必须在蓝图中实现 c++中不能实现
但是 蓝图实现的函数可以在c++中调用 (获得对象的指针/引用)
相当于蓝图版的纯虚函数
左侧面板中找到函数 点击之后实现函数
3.BlueprintNativeEvent
必须在c++中默认实现 在蓝图中实现会覆盖c++中的实现
相当于蓝图版的虚函数 并且带有默认的c++实现
UFUNCTION(BlueprintNativeEvent,BlueprintCallable)
void Say2();
我们在c++中需要实现的不是Say2() 而是 Say2_Implementation();
void AMyActor::Say2_Implementation()
{
UE_Log(LogTemp, Warning, TEXT(" c++ 实现 "))
}
注意不要实现Say2() 否则会导致错误
当调用Say2() 时 会根据有没有在蓝图覆盖 调用不同的版本
如果在蓝图中覆盖 那么就会执行蓝图的实现
如果在蓝图中未覆盖 那么就会调用c++中的实现
也可以使用Say2_Implementation() 强制调用c++中的实现
还可以在蓝图中调用父类实现 将蓝图和c++的实现一起调用
原理:
当使用BlueprintNativeEvent修饰函数时
UHT会自动创建一个 函数名_Implementation
的函数
同时 自动实现Say2()函数
.h
UFUNCTION(BlueprintNativeEvent,BlueprintCallable)
void Say2();
//引擎自动生成
virtual void Say2_Implementation() ;
.cpp
//引擎自动生成
void AMyActor::Say2()
{
if (/* 检查蓝图是否覆盖了该方法 */)
{
// 调用蓝图实现
BlueprintImplementableEvent<UMyActor::Say2>();
} else {
// 调用 C++ 默认实现
Say2_Implementation();
}
}