Blueprint —— 蓝图技术指南

目录

一,蓝图函数库

二,蓝图编译器

术语

编译过程

三,向蓝图公开游戏元素

使类可蓝图化

可读和可写属性

可执行和可覆盖函数

四,将C++暴露给蓝图

速度

复杂度

范例

创建蓝图 API:提示和技巧


        蓝图 是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调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值