目录
蓝图 是UE4中引入的一个强大新功能,是创建新UClasses的一种方法,无需书写或编译任何代码;当创建一个蓝图时,可以选择扩展C++类或另一个蓝图类;然后,可添加、排列及自定义Components,使用可视化的脚本语言实现自定义的逻辑,对Event及交互做出反应,定义变量,处理输入,及创建一种完全自定义的对象类型;
每个蓝图都具有一个Construction Script(C++中的构造函数类似),创建对象时运行它;该脚本可动态地基于多个因素构建Actor实例,如,一个可以自动调整大小来填充建筑物间空隙的篱笆;从这个角度来说,蓝图也可以看成是一个非常强大的预制系统;
一,蓝图函数库
在开发过程中,通常会发现需要通过函数集来简化项目开发;这些函数通常无所属,可在多种游戏代码之间重复使用;通过蓝图编译时通常也会需要这些函数;如需要公开共享效用函数,不想将它们和一种特定的游戏对象类型捆绑在一起;对于这类情况,使用 蓝图函数库 ;
蓝图函数库是一个静态函数的合集,提供不与特定游戏对象绑定的功能;这些库可群组化为逻辑函数集(如 AI 蓝图库),或包含提供多种不同功能区域(如系统蓝图库)访问的函数;
创建蓝图函数库与使用 UFUNCTION() 宏对蓝图公开函数十分相似;所有蓝图类均继承自 UBlueprintFunctionLibrary,而非派生自 Actor 或 UObject,只应包含静态方法;
UCLASS()
class UAnalyticsBlueprintLibrary : public UBlueprintFunctionLibrary
{
GENERATED_UCLASS_BODY()
/** Starts an analytics session without any custom attributes specified */
UFUNCTION(BlueprintCallable, Category = "Analytics")
static bool StartSession();
蓝图函数库为 UObject 非直接派生,需要标准 UCLASS() 和 GENERATED_UCLASS_BODY() 宏;还将在可从蓝图进行调用的函数上添加 UFUNCTION() 宏;蓝图函数库中的函数可被设计为 BlueprintCallable 或 BlueprintPure,取决于调用是否存在副作用;
//函数实现
bool UAnalyticsBlueprintLibrary::StartSession()
{
TSharedPtr<IAnalyticsProvider> Provider = FAnalytics::Get().GetDefaultConfiguredProvider();
if (Provider.IsValid())
{
return Provider->StartSession();
}
else
{
UE_LOG(LogAnalyticsBPLib, Warning, TEXT("StartSession: Failed to get the default analytics provider. Double check your [Analytics] configuration in your INI"));
}
return false;
}
AAIController* UAIBlueprintHelperLibrary::GetAIController(AActor* ControlledActor)
{
APawn* AsPawn = Cast<APawn>(ControlledActor);
if (AsPawn != nullptr)
{
return Cast<AAIController>(AsPawn->GetController());
}
return Cast<AAIController>(ControlledActor);
}
二,蓝图编译器
与普通C++类一样,蓝图在使用前需要进行编译;当单击 编译(Compile)按钮时,系统将把蓝图资源的属性和图表转换为类;
术语
- $ FKismetCompilerContext,执行编译工作的类,系统为每次编译生成一个新实例,存储正在编译的类、蓝图等的引用;
- $ FKismetFunctionContext,保存用于编译单个函数的信息,如对关联图表、属性和生成的UFunction的引用;
- $ FNodeHandlingFunctor,一个辅助工具类,用于处理编译器中的一个节点类(单件),包含用于注册引脚连接和生成编译语句的函数;
- $ FKismetCompiledStatement,编译器中的工作单元,编译器将节点转换为一组已编译语句,后端将这些语句转换为字节码操作;
- $ FKismetTerm,图表中的终端(文字、常量或变量引用),每个数据引脚连接都与其中一个终端关联!还可在"NodeHandlingFunctor"中为Scratch变量、中间结果等创建自己的术语;
编译过程
清理类:
类是现场编译的,意味着相同的 UBlueprintGeneratedClass 会被一次又一次地清理和重用, 因此指向类的指针不必固定;CleanAndSanitizeClass() 将属性和函数从类中移到临时包中的垃圾类中, 然后清除类中的任何数据;
创建类属性:
编译器在蓝图的 NewVariables 以及其他一些地方(构造脚本等)上进行迭代, 以查找类所需的所有UProperty,然后在函数 CreateClassVariablesFromBlueprint() 中创建UClass作用域上的UProperty;
创建函数列表:
编译器通过处理事件图表,处理函数图表和预编译函数(如为每个context调

最低0.47元/天 解锁文章
4024

被折叠的 条评论
为什么被折叠?



