Blueprint —— 蓝图技术指南

Unreal Engine 4核心概念解析:Blueprint(蓝图)——可视化脚本系统的完全指南 UE4蓝图系统是一种可视化游戏脚本工具,无需编程即可创建复杂游戏逻辑。它通过节点连接代替传统代码编写,支持变量、函数、事件等完整编程概念。蓝图编辑器包含组件面板、图表区域和细节面板等核心模块,提供事件节点、函数节点等多种类型。系统采用事件驱动编程模式,如碰撞检测响应逻辑,并能创建多种蓝图类型(类蓝图、关卡蓝图等)。该工具使游戏开发民主化,让非程序员也能参与逻辑设计,大幅降低开发门槛。 阅读详情

目录

一,蓝图函数库

二,蓝图编译器

术语

编译过程

三,向蓝图公开游戏元素

使类可蓝图化

可读和可写属性

可执行和可覆盖函数

四,将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调用 PrecompileFunction()) 来为类创建函数列表;

  • 处理事件图表,由 CreateAndProcessUberGraph() 函数执行,此函数将所有事件图表复制到一个大图表中,之后节点有机会扩展;然后, 此函数为图表中的每个事件节点创建一个函数存根,并为每个事件图表创建一个 FKismetFunctionContext ;

  • 处理函数图表,函数图表的处理由 ProcessOneFunctionGraph() 函数完成, 此函数将每个图表复制到一个临时图表中,其中节点将获得机会而展开;此函数还将为每个函数图表都创建一个 FKismetFunctionContext ;

  • 预编译函数,函数的预编译由每个context的 PrecompileFunction() 处理;

绑定和链接类:

        现在编译器已经了解类的所有UProperty和UFunction,因此可以绑定和链接该类,这包括填充属性链、属性大小、函数图等;此时,从本质上看,它具有一个类标头 -
减去最终的标记和元数据 - 以及一个类默认对象(CDO);

编译函数:

        下一步是为剩余的节点生成 FKismetCompiledStatment 对象, 此操作使用 AppendStatementForNode() 通过节点处理器的 Compile() 函数完成;此函数可以在编译函数中创建 FKismetTerm 对象,但前提是这些对象仅在本地使用;

完成编译类:

        为了完成编译类,编译器将确定类标记,并从父类传播标记和元数据,最后执行一些最终检查,以确保编译过程中一切正常;

后端发出生成的代码:后端将每个函数上下文中的语句集合转换为代码;

  • FKismetCompilerVMBackend
  • FKismetCppBackend

复制类默认对象属性:

        编译器使用一个特殊的函数 CopyPropertiesForUnrelatedObjects() 将类的旧CDO中的值复制到新CDO中;属性通过标记序列化复制, 因此只要名称一致,它们就应当会被正确地传输;在此阶段,CDO的组件将被重新实例化并进行适当的修复;操作时以GeneratedClass CDO为准;

重新实例化:

        由于类可能已经更改了大小,且属性可能已经过添加或删除, 因此编译器需要用刚编译的类重新实例化所有对象;这个过程使用 TObjectIterator 查找类的所有实例,生成一个新实例,然后使用 CopyPropertiesForUnrelatedObjects() 函数将旧实例复制到新实例;

三,向蓝图公开游戏元素

        使用蓝图可以使代码非常灵活,从而提供许多好处;如, 游戏设计人员可能希望在游戏中实现一种新型武器;作为程序员,现在编写武器代码的方式与传统方式几乎完全相同,而不同之处仅在于公开了一些重要的功能, 比如射速和Fire()函数;在游戏测试后,设计师确定需要改变枪支的射速以呈曲线射击;设计师可以简单地进入蓝图并直接更改射速,而不是对射速重新编码并重新编译游戏,从而节省设计师和程序员的时间;

使类可蓝图化

        为创建从某个类扩展而来的蓝图,必须将该类定义为 Blueprintable ; 这涉及到在类定义之前的 UCLASS() 宏中添加此关键字;此关键字使蓝图系统能够感知该类, 以便显示在 New Blueprint 对话框的类列表中,且可选择它作为所创建蓝图的父类;

//最简单的声明形式
UCLASS(Blueprintable)
class AMyBlueprintableClass : AActor
{
	GENERATED_BODY()
}
关键字说明
Blueprintable将该类公开为可接受的用于创建蓝图的基类;默认值为NotBlueprintable,但继承时除外;由子类继承;
BlueprintType将该类公开为可用于蓝图中的变量的类型;
NotBlueprintable指定此类不是用于创建蓝图的可接受基类;否定指定可蓝图化关键字的父类的效果;
可读和可写属性

        为了将C++类中定义的变量公开给从该类扩展而来的蓝图,必须使用 UPROPERTY() 宏中列出的下列关键字之一来定义该变量; 这些关键字使蓝图系统能够感知该变量,以便在 My Blueprint 面板中显示该变量, 并且可以设置或访问该变量的值;

//Character's Health
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Character")
float health;
关键字说明
BlueprintReadOnly此属性可以由蓝图读取,但不能修改;
BlueprintReadWrite此属性可以通过蓝图读取或写入;
Multicast Delegate Keywords说明
BlueprintAssignable应公开属性以在蓝图中赋值;
BlueprintCallable公开属性以在蓝图图表中调用;
可执行和可覆盖函数

        为了从蓝图调用本地函数,必须使用 UFUNCTION() 宏中列出的下列关键字之一来定义该函数;这些关键字使蓝图系统能够感知该函数,以便在上下文菜单或控制板中显示该函数,并可将其添加到图表并执行 - 或在事件的情况下,可覆盖和执行这些函数;

//最简单的声明形式
UFUNCTION(BlueprintCallable, Category="Weapon")
void Fire();

        在创建函数签名时,注意,通过引用传递某一参数将使该参数成为蓝图节点上的输出引脚;若要使参数通过引用传递并仍然显示为输入,请使用"UPARAM()"宏;

UFUNCTION(BlueprintCallable, Category = "Example Nodes")
static void HandleTargets(UPARAM(ref) TArray<FVector>& InputLocations, TArray<FVector>& OutputLocations);

        还可使用"UPARAM()"来更改引脚的显示名称;

/** 根据采用度数的旋转值制作一个旋转体{绕Z轴的旋转、绕X轴的旋转、绕Y轴的旋转} */
UFUNCTION(BlueprintPure, Category="Math|Rotator", meta=(Keywords="construct build rotation rotate rotator makerotator", NativeMakeFunc))
static FRotator MakeRotator(
UPARAM(DisplayName="X (Roll)") float Roll,
UPARAM(DisplayName="Y (Pitch)") float Pitch,
UPARAM(DisplayName="Z (Yaw)") float Yaw);

关键字

Blueprint to Native Communication

说明
BlueprintCallable可从蓝图中调用的本地函数,执行本地代码,将更改所调用对象的某些内容或一些其他全局状态;意味着,必须"调度"此函数,或者明确地告诉它相对于其他节点执行的顺序;用白色的执行线来执行此操作;所有蓝图可调用函数将按照它们在白色执行行上出现的顺序调用;
BlueprintPure可从蓝图中调用的本地函数,执行本地代码,不会更改它所调用对象的任何内容或任何其他全局状态;意味着调用这个节点不会改变任何东西,只需要输入,然后告诉输出;它们是诸如数学节点(+、-、*等)、或变量获取器或任何永远都不会改变任何内容之类的东西;不需要调度,也没有白色的执行线的连接;由编译器根据哪个BlueprintCallable节点需要这些节点生成的数据而自动计算出来;

关键字

Native to Blueprint Communication

说明
BlueprintImplementableEvent

这是允许本地函数调用蓝图的主要方式;就像在蓝图中实现的虚拟函数;

如不存在实现,则该函数调用将被忽略;

必须注意的是,如BlueprintImplementableEvent没有返回值或输出参数,那么它将显示为一个事件,可通过右击并在蓝图事件图表中选择它来使用;

如有返回值或任何输出参数,将在 My Blueprints 选项卡中列出,然后可通过右单并选择实现的函数来覆盖;

注意,BlueprintImplementableEvents没有函数的本地实现;

BlueprintNativeEvent

除了如果蓝图没有覆盖此函数,则调用此函数的本地默认实现之外,此函数与上述函数别无二致;

如想要某种默认行为(而蓝图没有实现它),但又希望蓝图能够在需要时覆盖功能,那么此函数将大有帮助;这些函数的使用成本更高,所以只将它们用在需要功能的地方;

当覆盖BlueprintNativeEvent时,如需要,仍然可以调用本地实现,方法是在事件或函数条目节点上右击,并选择"Add call to parent";

四,将C++暴露给蓝图

可从两个主要方面考虑使用 C++ 或蓝图:

  • 速度
  • 表达式复杂度

        这两因素之外,便主要取决于游戏的复杂度和团队的构成;如团队中美术师的数量多于程序员,则蓝图的优越性大于 C++ 代码;相反如程序员数量较多,则最好使用 C++;还需预计开发过程中人员的缺席;在 Epic,普遍的工作流程是 - 内容设计师创建十分复杂的蓝图后,程序员编写新蓝图节点的代码,明确如何将大量工作压缩到 C++ 中,这样就能将功能块移入一个新的 C++ 函数中;较好的方法是大量使用蓝图,复杂度达到一定程度转入 C++,使功能的表达更加简洁(否则对非程序人员而言过于复杂);

速度

        实际上,蓝图执行的速度比 C++ 执行慢;这并不意味着会影响性能,但需大量计算或进行高频率操作时,最好使用 C++;也可根据团队状况和项目性能对二者进行完美结合;如蓝图功能较多,可将部分功能移入 C++ 使速度加快,蓝图中剩余的部分功能可保留灵活性;如分析表明蓝图中的一项操作耗时极长,考虑只将该部分移入 C++,其他部分仍然保留在蓝图中;

        如控制上千个 Actor 的群组系统通过蓝图可视化脚本执行时间极长;在这类情况下,在 C++ 中处理决定、路径、和其他群组功能性能更佳,之后可将部分调整参数和控制函数公开到蓝图;

复杂度

        就表达式复杂度而言,部分操作在 C++ 中更容易执行;蓝图可良好地执行大量操作,但部分内容不易在节点中表达;操作大型数据集、执行字符串操作,在大量数据集上执行复杂算术等内容均十分复杂,不易在视觉系统中进行操作;这些内容更适合于 C++,可轻松进行查看,了解具体细节;群组系统更适合 C++ 代码的另一个原因在于表达式复杂度;

范例

部分功能块适合在 C++ 中处理,部分适合在蓝图中处理,如:

  • 程序员可在 C++ 中创建自定义事件的角色类,之后蓝图可用于该角色类的延展,实际指定模型并进行默认设置;

  • 可在 C++ 中实现能力系统的基础类,之后设计师再创建实际执行操作的蓝图;

  • "收集"或"重生"函数为可在蓝图中实现的事件,这样的可拾取道具可被覆写,以便设计师生成不同粒子发射器和声效;

创建蓝图 API:提示和技巧

创建对蓝图公开的 API 时需要考虑以下几点:

  • 可选参数便于在蓝图中处理:

/**
* 将字符串显示到日志中,也可选择显示到屏幕上。
* 如 Print To Log 为 true,它将显示在 Output Log 窗口中。否则它将被记录为"Verbose",通常不会显示。
*
* @param	InString		登出字符串
* @param	bPrintToScreen	是否将输出显示到屏幕上
* @param	bPrintToLog		是否将输出保存到日志中
* @param	bPrintToConsole	是否将输出显示到控制台
* @param	TextColor		是否将输出显示到控制台
*/
UFUNCTION(BlueprintCallable, meta=(WorldContext="WorldContextObject", CallableWithoutWorldContext, Keywords = "log print", AdvancedDisplay = "2"), Category="Utilities|String")
static void PrintString(UObject* WorldContextObject, const FString& InString = FString(TEXT("Hello")), bool bPrintToScreen = true, bool bPrintToLog = true, FLinearColor TextColor = FLinearColor(0.0,0.66,1.0));
  • 带有大量返回参数的函数和返回结构体的函数之间优先前者;
UFUNCTION(BlueprintCallable, Category = "Example Nodes")
static void MultipleOutputs(int32& OutputInteger, FVector& OutputVector);
  • 可在现有函数上添加新参数,但如要进行移除或变更,则需要否决原始函数并添加一个新函数;必须使用否决元数据,使新函数的信息显示在蓝图中;
UFUNCTION(BlueprintCallable, Category="Collision", meta=(DeprecatedFunction, DeprecationMessage = "Use new CapsuleOverlapActors", WorldContext="WorldContextObject", AutoCreateRefTerm="ActorsToIgnore"))
static ENGINE_API bool CapsuleOverlapActors_DEPRECATED(UObject* WorldContextObject, const FVector CapsulePos, float Radius, float HalfHeight, EOverlapFilterOption Filter, UClass* ActorClassFilter, const TArray<AActor*>& ActorsToIgnore, TArray<class AActor*>& OutActors);
  • 如函数需要接受枚举,考虑将"expand enum as execs"用作元数据,可使节点更易于使用;
UFUNCTION(BlueprintCallable, Category = "DataTable", meta = (ExpandEnumAsExecs="OutResult", DataTablePin="CurveTable"))
static void EvaluateCurveTableRow(UCurveTable* CurveTable, FName RowName, float InXY, TEnumAsByte<EEvaluateCurveTableResult::Type>& OutResult, float& OutXY);
  • 许多完成耗时较长的操作均为隐藏函数;
/**
* 执行带延迟的隐藏操作。
*
* @param WorldContext	世界背景。
* @param Duration 		延迟长度。
* @param LatentInfo 	隐藏操作。
*/
UFUNCTION(BlueprintCallable, Category="Utilities|FlowControl", meta=(Latent, WorldContext="WorldContextObject", LatentInfo="LatentInfo", Duration="0.2"))
static void	Delay(UObject* WorldContextObject, float Duration, struct FLatentActionInfo LatentInfo );
  • 如有可能,考虑将函数放入共享库;便于在多个类之间使用,避开"target"引脚;
class DOCUMENTATIONCODE_API UTestBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
  • 尽可能将节点标记为纯,可避免在节点上使用连线的执行引脚;
/* 在 0 和 最大 - 1 之间返回一致分配的随机数 */
UFUNCTION(BlueprintPure, Category="Math|Random")
static int32 RandomInteger(int32 Max);
  • 将一个函数标记为 const 也可使蓝图节点不带执行引脚;
/**
* 获得 actor 到世界的转换。
* @return 从 actor 空间转换到世界空间的转换。
*/
UFUNCTION(BlueprintCallable, meta=(DisplayName = "GetActorTransform"), Category="Utilities|Transformation")
FTransform GetTransform() const;

UE5笔记【十】第一个蓝图项目:bluePrint。 新建蓝图。各种结点。组件。 阅读详情

相关推荐

UE4-(蓝图)第五十四课创建蓝图函数库

有时候我们需要自己创建全局函数库,该函数与具体蓝图类无关,逻辑不依赖于某一个具体的类都可以放到函数库中。 函数库中的函数之间是没有任何数据交流只是归为了一个类中(可以为纯虚函数),不像普通蓝图类中的函数是可以通过成员变量进行数据交流。 一、创建方法 文件夹空白处右键,选择Blueprints/BlueprintFunctionLibrary 创建函数库,并重命名。 二、创建函数实现生产...

Stone的博客 4128

UE4 实用C++包裹属性说明(_杰森大师)

Blueprintable和BlueprintType Blueprintable用蓝图去继承当前父类去实现蓝图 BlueprintType在其他的蓝图里面把这个类当作一个变量来使用 意思就是下面两张图 meta meta中DisplayName代表的是他在蓝图中搜索或者在default编译界面中显示的名字,ClampMin和ClampMax分别代表最小最大值,TodTip代表提示,还有一个...

weixin_42295465的博客 2185

Unreal Engine蓝图混合技术:TypeScript与蓝图的非侵入式集成方案

在游戏开发中,代码复用与架构解耦是提升工程效率的核心挑战。传统继承模式存在单继承限制和破坏性修改等问题,而混合(Mixin)技术通过横向组合的方式,允许在不修改原始类定义的情况下动态注入功能。这种技术价值在于实现了非侵入式的功能扩展,尤其适用于需要为大量已有对象添加统一行为(如日志记录、状态效果、调试工具)的场景。通过运行时动态修改类行为,混合技术能够将TypeScript/JavaScript的工程化能力无缝注入Unreal Engine蓝图系统,实现脚本逻辑与可视化编辑的优势互补。本文以Blueprin

weixin_30550081的博客 391

Blueprint —— 蓝图的使用(二)

蓝图的使用;

NapoleonCoder的博客 2123

什么是 Flask 的蓝图(Blueprint)

Flask 的蓝图(Blueprint)是一种模块化工具,允许开发者将应用程序的路由、视图和其他逻辑分成独立的模块。这对于组织大型 Flask 项目非常有用,使代码更清晰、可维护,并促进团队协作。蓝图在大型项目中几乎是不可或缺的工具,有助于让代码更加整洁高效!两个模块可以独立开发,并在主应用中轻松注册和管理。

Debug yourself! 1347

【脑电分析系列】第15篇:脑电功能连接性与脑网络分析(二):Granger因果性、图论指标与复杂网络构建

摘要: 本文深入探讨了脑电(EEG)分析中的高阶连接性方法——有效连接(Effective Connectivity),重点介绍了Granger因果性(Granger Causality, GC)的原理与应用。GC通过统计预测揭示脑区间信息流动方向,超越了传统功能连接的同步性分析。文章还结合图论指标(如度、路径长度、聚类系数和模块化)量化脑网络的拓扑结构,并通过Python代码(MNE和NetworkX库)演示了从EEG数据构建、分析复杂脑网络的完整流程。该研究为理解大脑动态互动、认知任务信息流及神经系统疾

qq_32516809的博客 1559

Jujutsu 设计文档蓝图(Design Doc Blueprint):为 jj 新特性撰写技术提案的完整指南

Jujutsu(jj)在推进大型技术决策时依赖一套正式的设计文档(Design Doc)流程:任何涉及新组件或重大改动的特性,都必须先通过评审才能合入代码。本文以仓库中的 [docs/design_doc_blueprint.md](https://link.gitcode.com/i/5f215df2c03fb7349b4848d932498fd3) 模板为骨架,结合 [docs/design_

gitblog_00345的博客 741

Howland电流源电路:从理论到实践的深度解析与优化策略

本文深度解析了Howland电流源电路的工作原理,从经典四电阻架构的“虚短”“虚断”分析,到其实现宽带恒流输出的理论优势。重点剖析了实践中因电阻精度、运放参数及PCB布局导致的性能瓶颈,并提供了引入第五电阻、优化运放选型等关键优化策略,旨在将输出阻抗从kΩ级提升至MΩ级,以满足精密测量与传感器驱动等应用需求。

weixin_29243063的博客 441

Solid Glass 开源贡献完整教程:从本地开发、CI 检查到 PR 合入的全流程

Solid Glass 是一个专为 AI 应用打造的玻璃拟态设计系统,基于 shadcn/ui 与 Tailwind CSS 构建。这篇开源贡献教程带你完整走通参与 Solid Glass 的全流程:搭建本地开发环境、读懂并跑通 CI 检查、正确提交签名(DCO),最后让 PR 顺利合入——哪怕你是第一次给开源项目贡献代码。 ## 一、3 分钟读懂 Solid Glass:为什么它值得你贡献

gitblog_00609的博客 80

SARScape实战:集成GACOS数据优化InSAR大气校正全流程

本文详细介绍了如何在SARScape软件中集成GACOS数据,以优化InSAR大气校正的全流程。通过实战步骤,从GACOS数据申请、下载、导入,到在单景干涉图和SBAS-InSAR流程中应用,有效剥离大气相位延迟,显著提升形变监测结果的精度与可靠性,实现从“雾里看花”到“拨云见日”的转变。

weixin_28419039的博客 397

从桨叶设计到电机匹配:手把手教你调出无人机最佳动力组合

本文系统介绍了无人机动力系统的核心匹配原则,重点解析了如何通过测试与数据分析,优化螺旋桨与电机的组合,从而显著提升系统力效与续航。文章提供了从参数解读、实战测试到深度调优的完整指南,帮助开发者解决电机过热、推力不足等常见问题,实现无人机性能最大化。

weixin_29305313的博客 235

python之蓝图blueprint浅析

目录 背景 一、python中的蓝图 二、创建蓝图 三、蓝图的运行机制 四、蓝图的url前缀 五、注册蓝图中的静态文件的相关路由 六、设置蓝图中模版的目录 七、调整session配置 背景 由于我们现在的项目开发是一个相对于来说非常耗时间和精力的工程,如果我们将所有的Flask的请求方法都写在同一个文件下的话,非常不便于我们的代码的管理和后期的功能代码的添加。 如下示例:我们在一个文件中写入多个路由,这会使代码维护变得困难。 如图所示,如果我们将所有...

专注自动化、性能测试、测试架构学习交流 1万+

保姆级教程:在CentOS 8上用libvirt + QEMU/KVM搭建ARM64虚拟机(含UEFI配置与常见坑点)

本文提供在CentOS 8上使用libvirt + QEMU/KVM搭建ARM64虚拟机的详细教程,涵盖UEFI配置与常见问题解决方案。通过环境准备、特殊配置要点、UEFI固件安装等步骤,帮助用户在x86架构服务器上高效运行ARM64虚拟化环境,特别适合开发测试与跨平台应用场景。

weixin_30292745的博客 129

python flask 蓝图(Blueprint)详解

Blueprint 模块化 随着flask程序越来越复杂,我们需要对程序进行模块化的处理,针对一个简单的flask程序进行模块化处理 举例来说: 我们在一个py文件中写入了很多路由, from flask import Flask app=Flask(__name__) @app.route('/') def inde...

mihaoyun.com的专栏 2万+

TypeError: XGBClassifier.fit() got an unexpected keyword argument ‘early_stopping_rounds‘ 解决方案

本文主要介绍了TypeError: XGBClassifier.fit() got an unexpected keyword argument 'early_stopping_rounds’解决方案,希望能对使用XGBoost的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

WPF用户控件间属性传递的艺术

本文详细介绍了WPF中父控件向子控件传递属性的方法。针对常见的绑定失效问题,重点讲解了使用RelativeSource绑定技术,通过指定AncestorType确保正确访问父控件属性。文章通过实例演示了从ParentModel传递属性到ChildUserControl依赖属性的完整实现过程,包括模型定义、XAML结构设计和代码实现。这种方法有效解决了数据上下文混淆问题,为WPF开发中的控件交互提供了可靠解决方案,有助于提升应用的灵活性和可维护性。

2501_90323865的博客 56

Flask 中的蓝图 Blueprint

Flask 中的蓝图 Blueprint 在实际的项目开发中,需要实现的功能是很多的,通常来说一个功能至少需要一个视图函数,代码量比较大。 如果将所有视图函数都写在同一个 py 文件中,功能没有问题,但是在维护时非常不方便,没有哪个项目会采用这种方式来写代码。 通常,会根据不同的功能模块,将视图函数写在不同的 py 文件中,这就需要使用到 Flask 中的蓝图Blueprint 。 一...

weixin_43790276的博客 1239

微信小程序转发功能异常报错 由于小程序违规分享功能暂时无法使用的解决办法

小程序右上角转发功能被封,不代表你违规了,而可能是你没认证、没备案!很多功能都是“先合规、后开发”,踩坑就晚了,别像我一样绕了三圈才发现问题。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2603

Blueprint —— 蓝图的使用(一)

蓝图的使用;

NapoleonCoder的博客 2466

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

flask 蓝图 Blueprint

当执行app.register_blueprint()注册蓝图时,app应用实例对象会将从蓝图对象的 deferred_functions列表中循环取出每一个之前注册的路由项,并把app应用实例对象自己作为参数执行路由项对应的lambda匿名函数,lambda匿名函数执行以后就会调用app.add_url_rule() 方法,这就将蓝图下子路由列表之前暂存的路由全部添加到了app应用实例对象的url_map总路由表中了,所以用户就可以在flask中访问到了蓝图中的视图。

blank_memory_的博客 795

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Flask Blueprint 蓝图的用法

        蓝图 Blueprint 是flax的子集,它可以有独立的templates、static等。而模块独立可以使整个工程变得清晰易读,也避免文件之间循环引用的问题Blueprint使用:1.首先在子文件夹init文件中定义蓝图,比如/main/__init__.py中 from flask import Blueprint main = Blueprint('main', __nam...

spark_csdn的博客 8496

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Blueprint(蓝图的使用)

Blueprint是一个存储了不同的URL请求操作的容器,这些操作在Blueprint被注册到一个应用以后就可以访问;flask通过Blueprint来组织URL和处理请求,所以Blueprint具有如下属性: 多个Blueprint可以注册到一个应用中 可以将一个Blueprint 注册到任何一个未使用的URL下 在应用初始化时,就需要注册需要使用的Blueprint 蓝图的使用: 项目目录结构...

保质期已过 1812

Flask 蓝图 Blueprint

为什么需要蓝图? 我们在使用Flask框架,是从写单个文件,执行hello world开始的。我们在这单个文件中可以定义路由、视图函数、定义模型等等。但这显然存在一个问题:随着业务代码的增加,将所有代码都放在单个程序文件中,是非常不合适的。这不仅会让代码阅读变得困难,而且会给后期维护带来麻烦。 如下示例:我们在一个文件中写入多个路由,这会使代码维护变得困难。 from flask ...

DevOps海洋的渔夫@专栏 948

Flask开发之蓝图Blueprint

前言:随着业务代码的增加,将所有代码都放在单个程序文件中,是非常不合适的。这不仅会让代码阅读变得困难,而且会给后期维护带来麻烦。

等待着冬天的风的博客 444

Factorio-Blueprint:Factorio蓝图自动化处理工具

Factorio-Blueprint:Factorio蓝图自动化处理工具 Factorio-Blueprint 是一个开源项目,使用 TypeScript 和 JavaScript 编写,旨在帮助玩家自动化地创建、修改和导出 Factorio 的蓝图和蓝图字符串。 项目基础介绍 Factorio-Blueprint 是一个基于 Node.js 的库,它支持从简单的任务(如添加或删除实体)到更复杂的...

gitblog_01013的博客 1254

【flask】Blueprint蓝图

目录 一、蓝图的作用 二、蓝图的基本使用: 三、注意事项 一、蓝图的作用 分层隔离(解耦):避免与项目同名的py文件里面有过多的指定不同内容的app.rout()会堆叠在同此文件。假设是文件处理系统里面,有用户详情页和书本详情页都堆放与项目同名的py文件里面,加上一些实现的函数,不便于管理,。 更加模块化:把某一模块的内容放到指定的蓝图可以更加清晰明了。例如,用了蓝图以后users会在...

雀黑够呛哥 379
上一篇: Blueprint —— Blueprint Editor(二)
下一篇: Blueprint —— 蓝图的使用(一)
挨代码
博客等级 码龄5年 1696粉丝 384原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值