UE_C++ —— Gameplay Classes
目录
一,Adding Classes
二,Class Headers
Class Declaration
Class Specifiers
Metadata Specifiers
三,Class Implementation
Class Constructor
引擎中每个游戏类都由一个类头文件(.h
)和一个类源文件(.cpp
)构成;类头包含类和类成员(如变量和函数)的声明,而在类源文件中是类功能的实现;引擎中的类拥有一个标准化的命名方案,通过首字母或前缀即可立即明了其为哪种类;
Prefix | Meaning |
---|---|
A | 从可生成的游戏对象的基础类进行延伸;它们是 Actor,可直接生成到世界场景中; |
U | 从所有游戏对象的基础类进行延伸;它们无法被实例到世界场景中,必须从属于 Actor;总体而言,它们是相似组件的对象; |
一,Adding Classes
主菜单Tools > New C++ Class...是一种快速简便的方法,将本机C++代码类添加到项目中,以便根据需要扩展功能;这会将纯内容项目转换为代码项目;确保安装了兼容版本的Visual Studio;
二,Class Headers
引擎中的游戏类通常拥有单独且唯一的类头文件;通常这些文件的命名与其中定义的类相匹配,减去 A
或 U
前缀,并使用 .h
文件扩展名;因此,AActor
类的类头文件命名为 Actor.h
;虽然 Epic 代码遵循这些规则,但当前引擎中类名称和源文件名之间不存在正式关系;
游戏类的类头文件使用标准 C++ 语法,并结合专门的宏,以简化类、变量和函数的声明过程;
在每个游戏类头文件的顶端,需要包含生成的头文件(自动创建);因此在 ClassName.h
的顶端必须出现以下行:
#include "ClassName.generated.h"
Class Declaration
类声明定义类的名称、其继承的类,以及其继承的函数和变量;类声明还定义了其他引擎和编辑器的特定行为(通过类说明符和元数据);
UCLASS([specifier, specifier, ...], [meta(key = value, key = value, ...)])
class ClassName : public ParentName
{GENERATED_BODY()
}
声明包含一个类的标准 C++ 类声明;在标准声明之上,描述符(如类说明符和元数据)将被传递到 UCLASS
宏;它们用于创建被声明类的 UClass
,可被看作引擎对类的专有表达;此外,GENERATED_BODY()
宏必须被放置在类体的最前方;
Class Specifiers
Class Specifier | Effect |
Abstract | 将类声明为"抽象基类",不可向关卡中添加此类的Actor;对于单独存在时没有意义的类,此说明符非常有用;如,ATriggerBase 基类是抽象类,而ATriggerBox 子类不是抽象类,可以放置在关卡; |
AdvancedClassDisplay | 强制类的所有属性仅在显示在细节面板的"高级(Advanced)"部分; |
AutoCollapseCategories=(Category1, Category2, ...) | 使父类上的 AutoExpandCategories 说明符列出类别的效果无效; |
AutoExpandCategories=(Category1, Category2, ...) | 为此类的对象指定应自动在编辑器属性窗口中展开的一个或多个类别;要自动展开未使用类别声明的变量,请使用声明变量的类的名称; |
Blueprintable | 将此类公开为用于创建蓝图的可接受基类;默认为NotBlueprintable ,除非继承时就并非如此;此说明符由子类继承; |
BlueprintType | 将此类公开为可用于蓝图中变量的类型; |
ClassGroup=GroupName | 指示在编辑器的Actor浏览器中启用 组视图(Group View) 时,Actor浏览器 应在指定的 GroupName 中包含此类及此类的所有子类; |
CollapseCategories | 指示此类的属性不应划分到编辑器属性窗口的类别中;此说明符会传播到子类,可由DontCollapseCategories 说明符覆盖; |
Config=ConfigName | 指示此类可在配置文件(.ini )中存储数据;如存在任何使用config 或globalconfig 说明符声明的类属性,此说明符将使这些属性存储在指定的配置文件中;此说明符会传播到所有子类并且无法使其无效,但是子类可通过重新声明config 说明符并提供不同的ConfigName 来更改配置文件;常见的ConfigName 值是"Engine"、"Editor"、"Input"和"Game"; |
Const | 此类中的所有属性和函数都是const 并且导出为const ;此说明符由子类继承; |
ConversionRoot | 根转换,将子类限制为仅可沿层级向上转换为第一个根类的子类; |
CustomConstructor | 阻止构造函数声明自动生成; |
DefaultToInstanced | 此类的所有实例都被认为是"实例化的";实例化的类(组件)将在构造时被复制;此说明符由子类继承; |
DependsOn=(ClassName1, ClassName2, ...) | 列出的所有类将先于此类被编译;可使用单个DependsOn 行(以逗号分隔)来标识多个依赖类,或可通过为每个类使用单独的DependsOn 行来指定多个依赖类;当某个类使用在另一个类中声明的结构体或枚举时,这非常重要,因为编译器仅知道它已编译了类中的哪些部分; |
Deprecated | 此类已弃用,序列化时将不保存此类的对象;此说明符由子类继承; |
DontAutoCollapseCategories=(Category, Category, ...) | 使列出的类别的继承自父类的AutoCollapseCategories 说明符无效; |
DontCollapseCategories | 使继承自基类的CollapseCatogories 说明符无效; |
EditInlineNew | 指示可从编辑器"属性(Property)"窗口创建此类的对象,而非从现有资源引用;默认行为是仅可通过"属性(Property)"窗口指定对现有对象的引用。此说明符会传播到所有子类;子类可通过 NotEditInlineNew 说明符覆盖它;; |
HideCategories=(Category1, Category2, ...) | 列出一个或多个应该对用户完全隐藏的分类;要隐藏未使用类别声明的属性,请使用声明变量的类的名称;此说明符会传播到子类; |
HideDropdown | 阻止此类在属性窗口组合框中显示; |
HideFunctions=(Category1, Category2, ...) | 让指定分类中的所有函数都对用户完全隐藏; |
HideFunctions=FunctionName | 将提到的函数对用户完全隐藏; |
Intrinsic | 指示此类直接在C++中声明,无 Unreal Header Tool 生成的样板;请勿在新类上使用此说明符; |
MinimalAPI | 导致仅导出此类的类型信息,以供其他模块使用;可以此类为目标进行强制转换,但此类的函数无法被调用(除了使用内联方法);这可以缩短编译时间,因为没有针对无需从其他模块访问其所有函数的类导出一切; |
NoExport | 指示此类的声明不应包含在由标头生成器自动生成的C++头文件中;必须在单独的头文件中手动定义该C++类声明;仅对本地类有效;请勿对新类使用此说明符; |
NonTransient | 使继承自基类的Transient 说明符无效; |
NotBlueprintable | 指定此类不是可用于创建蓝图的可接受基类,此为默认说明符,将由子类继承, |
NotPlaceable | 使继承自基类的Placeable 说明符无效;指示不可以在编辑器中将此类的对象放置到关卡、UI场景或蓝图中; |
PerObjectConfig | 此类的配置信息将按对象存储,在.ini 文件中,每个对象都有一个分段,根据对象命名,格式为[ObjectName ClassName] ;此说明符会传播到子类; |
Placeable | 指示可在编辑器中创建此类,而且可将此类放置到关卡、UI场景或蓝图(取决于类类型)中;此标志会传播到所有子类;子类可使用NotPlaceable 说明符覆盖此标志; |
ShowCategories=(Category1, Category2, ...) | 使列出的类别的继承自基类的HideCategories 说明符无效; |
ShowFunctions=(Category1, Category2, ...) | 在属性查看器中显示列出的类别中的所有函数; |
ShowFunctions=FunctionName | 在属性查看器中显示指定的函数; |
Transient | 从不将属于此类的对象保存到磁盘;当与播放器或窗口等本质上不持久的特定种类的原生类配合使用时,它非常有用;此说明符会传播到子类,但是可由NonTransient 说明符覆盖; |
Within=OuterClassName | 此类的对象无法在OuterClassName 对象的实例之外存在;这意味着,要创建此类的对象,需要提供OuterClassName 的一个实例作为其Outer 对象; |
Metadata Specifiers
Class Meta Tag | Effect |
BlueprintSpawnableComponent | 如其存在,组件类可由蓝图生成; |
BlueprintThreadSafe | 只在蓝图函数库上有效;此说明符将把此类中的函数在动画蓝图中的非游戏线程上标记为可调用; |
ChildCannotTick | 用于Actor和组件类;如本地类无法tick,那么基于此Actor或组件的蓝图生成类则无法tick,即使 bCanBlueprintsTickByDefault 为true也同样如此; |
ChildCanTick | 用于Actor和组件类;如本地类无法tick,那么可以覆盖基于此Actor或组件的蓝图生成类的 bCanEverTick 标签,即使 bCanBlueprintsTickByDefault 为false也同样如此; |
DeprecatedNode | 用于行为树节点,说明类已废弃,编译时将显示一条警告; |
DeprecationMessage="Message Text" | 如类已废弃,尝试编译使用此类的蓝图时,其将被添加到标准废弃警告; |
DisplayName="Blueprint Node Name" | 此节点在蓝图中的命名将被此处提供的值所取代,而非代码生成的命名; |
DontUseGenericSpawnObject | 不使用蓝图中的Generic Create Object节点来生成类的一个对象;此说明符只有在用于既非Actor又非ActorComponent的BluprintType类时才有意义; |
ExposedAsyncProxy | 在 Async Task 节点中公开此类的一个代理对象; |
IgnoreCategoryKeywordsInSubclasses | 用于让一个类的首个子类忽略所有继承的 ShowCategories 和 HideCategories 说明符; |
IsBlueprintBase="true/false" | 说明此类是否为创建蓝图的一个可接受基类,与 UCLASS 说明符、Blueprintable 或 NotBlueprintable 相似; |
KismetHideOverrides="Event1, Event2, .." | 不允许被覆盖的蓝图事件的列表; |
ProhibitedInterfaces="Interface1, Interface2, .." | 列出与类不兼容的接口; |
RestrictedToClasses="Class1, Class2, .." | 由蓝图函数库类使用,用于限制列表中命名类的用法; |
ShortToolTip="Short tooltip" | 完整提示文本过长时使用的简短提示文本,如父类选取器对话; |
ShowWorldContextPin | 说明放置在此类拥有的图表中的蓝图节点必须显式其World情景引脚(即使其通常状态下为隐藏也同样如此),因为此类的对象无法被用作World情景; |
UsesHierarchy | 说明类使用层级数据。用于实例化"细节"面板中的层级编辑功能; |
ToolTip="Hand-written tooltip" | 覆盖从代码注释自动生成的提示文本; |
ScriptName="DisplayName" | 在将此类、属性或函数导出到脚本语言时使用的名称;可以包含以启用的名称作为以分号分隔的额外条目; |
三,Class Implementation
所有游戏类必须使用 GENERATED_BODY
宏才能正确实现;这是在定义类及其所有变量和函数的类头(.h)文件中完成的;最佳方法是使类源和头文件的命名与实现的类相匹配,减去 A
或 U
前缀;因此,AActor
类的源文件命名为 Actor.cpp
,其头文件命名为 Actor.h
;对编辑器中"Add C++ Class"菜单选项创建的类而言,此操作将自动进行;
源文件(.cpp)必须囊括包含 C++ 类声明的头文件(.h),C++ 类声明通常为自动生成,但也可手动生成(如有必要);如,AActor
类的 C++ 声明在 EngineClasses.h
头文件中自动生成;这意味着 Actor.cpp
文件必须包括 EngineClasses.h
文件或轮流包含的另一个文件;总体而言只包含游戏项目的头文件,其中包含了游戏项目中游戏类的标头;以 AActor
和 EngineClasses.h
为例,其中包含了 EnginePrivate.h
标头,此标头则包含了 Engine.h
- Engine 项目的头文件 - 而该头文件又包含 EngineClasses.h
头文件;
#include "EnginePrivate.h"
Class Constructor
UObjects
使用 Constructors 设置属性和其他变量的默认值,并执行其他必要的初值设定;类构造函数通常放置在类实现文件中,如 AActor::AActor
构造函数位于 Actor.cpp
中;
注,部分构造函数可能以每个模块为基础放置在一个特殊的"constructors"文件中;如 AActor::AActor
构造函数可能存在于 EngineConstructors.cpp
中;这是自动转换过程的结果,从之前 DEFAULTS
块的使用到构造函数的使用;它们将随时间被移至其相应的类源文件;
也可以将构造函数内联放置在类头文件中;然而,如果构造函数在类头文件中,UClass 必须结合 CustomConstructor
说明符进行声明,因为这阻止了自动代码生成器在标头中创建构造函数声明;
Constructor Format
UObject 构建函数最基本的形式如下所示:
UMyObject::UMyObject()
{// 在此处初始化 Class Default Object 属性。
}
该构造函数初始化类默认对象(CDO),CDO 是类的新实例所基于的原版;此外还有一个次要构造函数,支持一个特殊的属性调整结构:
UMyObject::UMyObject(const FObjectInitializer& ObjectInitializer): Super(ObjectInitializer)
{// Initialize CDO properties here.
}
虽然以上构造函数实际上并不执行任何初始化,但引擎已将所有字段初始化为零、NULL,或其默认构造函数实现的任意值;然而,写入构建函数的任意初始化代码将被应用至 CDO,因此将被复制到引擎中正确创建的对象新实例上,正如 CreateNewObject
或 SpawnActor
;
被传入构造函数的 FObjectInitializer
参数除被标记为常数外,还可通过嵌入可变函数进行配置,以覆写属性和子对象;被创建的 UObject
将受到这些变更的影响,这可用于变更注册属性或组件的数值;
AUDKEmitterPool::AUDKEmitterPool(const FObjectInitializer& ObjectInitializer): Super(ObjectInitializer.DoNotCreateDefaultSubobject(TEXT("SomeComponent")).DoNotCreateDefaultSubobject(TEXT("SomeOtherComponent")))
{// Initialize CDO properties here.
}
在上例中,超类将在其构建函数中创建名为"SomeComponent"和"SomeOtherComponent"的子对象,但由于 FObjectInitializer 的原因,该操作将不会执行;在下例中,SomeProperty
在 CDO 中将默认为 26,因此在 AUTDemoHUD 的每个新实例中均为如此;
AUTDemoHUD::AUTDemoHUD()
{// 在此处初始化 CDO 属性。SomeProperty = 26;
}
Constructor Statics and Helpers
为更负责的数据类型设置数值(尤其是类引用、命名和资源引用)时,需要在构造函数中定义并实例化一个 ConstructorStatics 结构体,以保存所需的诸多属性数值;ConstructorStatics
结构体在构造函数首次运行时才会被创建;在随后的运行上它只会复制一个指针,使其处理速度极快;ConstructorStatics
被创建时,数值将被指定到结构体成员,以便稍后在构建函数上指定数值到实际属性时进行访问;
ContructorHelpers 是 ObjectBase.h
中定义的特殊命名空间;ObjectBase.h
包含用于执行构建函数特定常规操作的助手模板;如为资源或类寻找引用、以及创建并寻找组件的助手模板;
Asset References
理想状态下,类中的资源引用并不存在;硬编码资源引用很脆弱,优选方法是使用蓝图配置资源属性;然而,仍然完全支持硬编码引用;不需要在每次构造对象时搜索资源,因此这些搜索只执行一次;一个静态结构体可确保只执行一次资源搜索:
ConstructorHelpers::FObjectFinder
通过 StaticLoadObject
为特定的 UObject
寻找引用;它常用于引用存储在内容包中的资源;如未找到对象, 则报告失败;
ATimelineTestActor::ATimelineTestActor()
{// Structure to hold one-time initializationstruct FConstructorStatics{ConstructorHelpers::FObjectFinder<UStaticMesh> Object0;FConstructorStatics(): Object0(TEXT("StaticMesh'/Game/UT3/Pickups/Pickups/Health_Large/Mesh/S_Pickups_Base_Health_Large.S_Pickups_Base_Health_Large'")){}};static FConstructorStatics ConstructorStatics;// Property initializationStaticMesh = ConstructorStatics.Object0.Object;
}
Class References
ConstructorHelpers::FClassFinder
为特定的 UClass
寻找引用;如类未找到,则报告失败;
APylon::APylon(const class FObjectInitializer& ObjectInitializer):Super(ObjectInitializer)
{// 进行一次性初始化的结构static FClassFinder<UNavigationMeshBase> ClassFinder(TEXT("class'Engine.NavigationMeshBase'"));if (ClassFinder.Succeeded()){NavMeshClass = ClassFinder.Class;}else{NavMeshClass = nullptr;}
}
在许多情况下,可只使用 USomeClass::StaticClass()
,绕开复杂的全部 ClassFinder;如,在多数情况下均可使用以下方法:
NavMeshClass = UNavigationMeshBase::StaticClass();
对跨模块的引用而言,使用 ClassFinder 法较好;
Components and Sub-Objects
在构造函数中还可创建组件子对象并将其附着到 actor 的层级;生成一个 actor 时,将从 CDO 复制其组件;为确保组件固定被创建、被销毁和被正确地垃圾回收,构建函数中创建的每个组件的指针应被存储在拥有类的一个 UPROPERTY 中;
UCLASS()
class AWindPointSource : public AActor
{GENERATED_BODY()
public:UPROPERTY()UWindPointSourceComponent* WindPointSource;UPROPERTY()UDrawSphereComponent* DisplaySphere;
};AWindPointSource::AWindPointSource()
{// 创建一个新组件并对其命名。WindPointSource = CreateDefaultSubobject<UWindPointSourceComponent>(TEXT("WindPointSourceComponent0"));// 将新组件设为该 actor 的根组件,如已存在一个根组件,则将其附着到根上。if (RootComponent == nullptr){RootComponent = WindPointSource;}else{WindPointSource->AttachTo(RootComponent);}// 再创建一个组件。将其附着到刚才创建的第一个组件上。DisplaySphere = CreateDefaultSubobject<UDrawSphereComponent>(TEXT("DrawSphereComponent0"));DisplaySphere->AttachTo(RootComponent);// 在新组件上设置一些属性。DisplaySphere->ShapeColor.R = 173;DisplaySphere->ShapeColor.G = 239;DisplaySphere->ShapeColor.B = 231;DisplaySphere->ShapeColor.A = 255;DisplaySphere->AlwaysLoadOnClient = false;DisplaySphere->AlwaysLoadOnServer = false;DisplaySphere->bAbsoluteScale = true;
}通常没有必要对属于父类的组件进行修改。然而,在任何 `USceneComponent`(包括根组件)上调用 `GetAttachParent`、`GetParentComponents`、`GetNumChildrenComponents`、`GetChildrenComponents` 和 `GetChildComponent` 即可获得当前所有附着组件(包括父类创建的组件)的列表。
相关文章:
UE_C++ —— Gameplay Classes
目录 一,Adding Classes 二,Class Headers Class Declaration Class Specifiers Metadata Specifiers 三,Class Implementation Class Constructor 引擎中每个游戏类都由一个类头文件(.h)和一个类源文件&#x…...
windows上vscode cmake工程搭建
安装vscode插件: 1.按装fastc(主要是安装MinGW\mingw64比较方便) 2.安装C,cmake,cmake tools插件 3.准备工作完成之后,按F1,选择cmake:Quick Start就可以创建一个cmake工程。 4.设置Cmake: G…...
软件测试:1、单元测试
1. 单元测试的基本概念 单元(Unit):软件系统的基本组成单位,可以是函数、模块、方法或类。 单元测试(Unit Testing):对软件单元进行的测试,验证代码的正确性、规范性、安全性和性能…...
如果后台的Long类型的数据返回是null,那么Android客户端的数据bean的kotlin的Long类型的字段接受到数据后是null空指针吗?
如果后台的Long类型的数据返回是null,那么Android客户端的数据bean的kotlin的Long类型的字段接受到数据后是null空指针吗? DeepSeek R1 思考 35 秒 思考过程 好的,用户的问题是关于在Android客户端使用Kotlin处理后台返回的Long类型数据为n…...
Vue3 打造 Windows 桌面个性高效组件工具
软件介绍 Widgets 这款基于 Vue3 构建的开源 Windows 桌面小部件工具超实用。 其多样化组件库涵盖超 20 种,从倒计时、打工进度等实用工具,到抖音热榜等实时资讯组件应有尽有,各组件独立运行,满足多场景需求。 高度自定义布局支持…...
学习笔记-沁恒第四讲-米醋
一, 语音模块:数据包发送 刷卡模块:数据包接收 AS608:数据包发送接收 二,第三讲文件夹改成第四讲,工程也改成第四讲 三,目前在内存里面。保存新值,掉电会丢失 u8 password[6]{1,…...
epoll_event的概念和使用案例
epoll_event 是 Linux 下 epoll I/O 多路复用机制的核心数据结构,用于描述文件描述符(File Descriptor, FD)上发生的事件及其关联的用户数据。通过 epoll,可以高效地监控多个文件描述符的状态变化(如可读、可写、错误等…...
容器和虚拟机选择对比
1. 概述 如果主要需求是学习和测试 Ubuntu 下的命令行工具或服务型应用,推荐使用 Docker Docker 更轻量、更高效,适合快速搭建和销毁环境。 启用 WSL 2,Docker Desktop 是一个非常好的选择。 如果需要完整的桌面环境或进行复杂的系统级开…...
C++17中std::chrono::duration和std::chrono::time_point的舍入函数
文章目录 1. std::chrono::duration的舍入函数1.1 floor1.2 ceil1.3 round 2. std::chrono::time_point的舍入函数2.1 示例 3. 舍入函数的应用场景3.1 时间测量3.2 数据记录3.3 时间同步 4. 总结 在C17中, std::chrono库提供了一组强大的时间处理工具,包…...
基于SpringBoot的线上汽车租赁系统的设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
基于Dancing Links的精确覆盖算法(解决NP难问题)和量子计算机模拟中的Shor算法(涉及数论与量子叠加态模拟)
一、Dancing Links算法实现数独求解(NP难问题) 算法方案 数独可转化为精确覆盖问题,使用Knuth提出的DLX算法实现高效求解。该算法通过双向十字循环链表实现快速回溯,时间复杂度可达O(n^k)(k为常数) #include <iostream> #include <vector> #include <c…...
体育品牌排行榜前十名:MLB·棒球1号位
MLB是一个融合了棒球文化与街头时尚元素的潮流运动品牌。以下是对该品牌的详细介绍: 一、品牌背景 • 全称:MLB全称是Major League Baseball,即美国职业棒球大联盟。不过,作为品牌的MLB并非由美国职业棒球大联盟直接运营&#x…...
Java网络编程封装
系列文章目录 Java知识点 文章目录 系列文章目录👉前言👉一、封装的目标👉二、套接字层封装👉壁纸分享👉总结 👉前言 Java 网络编程封装原理主要围绕着将底层的网络通信细节隐藏起来,提供简洁…...
数字内容体验标杆案例解析
内容概要 在数字化转型浪潮中,数字内容体验正成为企业构建核心竞争力的关键抓手。本文通过拆解金融、零售、文旅等领域的标杆案例,系统分析沉浸式设计与智能交互系统的技术融合路径,揭示头部企业如何通过XR技术、实时数据可视化及场景化内容…...
区块链相关方法-PEST分析
一、定义:一种用于分析企业外部宏观环境的工具。PEST 这四个字母分别代表政治(Political)、经济(Economic)、社会(Social)和技术(Technological)。这种分析方法帮助企业或组织了解宏…...
Dify安装教程:Linux系统本地化安装部署Dify详细教程
1. 本地部署 Dify 应用开发平台 环境:Ubuntu(24.10) docker-ce docker compose 安装 克隆 Dify 源代码至本地环境: git clone https://github.com/langgenius/dify.git 启动 Dify: cd dify/docker cp .env.example...
git使用-克隆远程项目、分支管理
文章目录 克隆远程项目到本地1. 远程找到需要克隆的项目,复制ssh地址2. idea开启git版本控制(如果已经开了,忽略此步骤)3. clone远端项目4. 克隆完成 分支管理1. 新建分支2. 切换分支3. 合并分支4. 储存变化 克隆远程项目到本地 …...
QT 引入Quazip和Zlib源码工程到项目中,无需编译成库,跨平台,压缩进度
前言 最近在做项目时遇到一个需求,需要将升级的文件压缩成zip,再进行传输; 通过网络调研,有许多方式可以实现,例如QT私有模块的ZipReader、QZipWriter;或者第三方库zlib或者libzip或者quazip等࿱…...
SQLMesh 系列教程8- 详解 seed 模型
在数据分析和建模过程中,外部模型(External Models)在 SQLMesh 中扮演着重要角色。外部模型允许用户引用外部数据源或现有数据库表,从而实现灵活的数据整合和分析。本文将介绍外部模型的定义、生成方法(包括使用 CLI 和…...
oracle apex post接口
日常记录 使用到了apex_json方式接收 、、、1 首先,接口通过body传递过来,成功接收到, 数据格式为 JSON_OBJECT_T l_json : JSON_OBJECT_T.parse(:body); 这里我用参数接收到 然后 里面是包含了 "data" 我用 继续接收到这个 l…...
复制所绑定元素文本的vue自定义指令
最近写了一个复制所绑定元素文本的vue自定义指令,给大家分享一下。 import { ElMessage } from element-plus// data-* 属性名 const dataCopyBtnTextAttribute data-copy-btn-text // 复制按钮的class,结合项目实际进行设置 const copyBtnClass icon…...
若依-@Excel新增注解numberFormat
Excel注解中原本的scale会四舍五入小数,导致进度丢失 想要的效果 显示的时候保留两个小数真正的数值是保留之前的数值 还原过程 若以中有一個專門的工具类,用来处理excel的 找到EXCEL导出方法exportExcel()找到writeSheet,写表格的方法找到填充数据的方法…...
内容中台重构智能服务:人工智能技术驱动精准决策
内容概要 现代企业数字化转型进程中,内容中台与人工智能技术的深度融合正在重构智能服务的基础架构。通过整合自然语言处理、知识图谱构建与深度学习算法三大技术模块,该架构实现了从数据采集到决策输出的全链路智能化。在数据层,系统可对接…...
网络安全:DeepSeek已经在自动的挖掘漏洞
大家好,我是AI拉呱,一个专注于人工智领域与网络安全方面的博主,现任资深算法研究员一职,兼职硕士研究生导师;热爱机器学习和深度学习算法应用,深耕大语言模型微调、量化、私域部署。曾获多次获得AI竞赛大奖,拥有多项发明专利和学术论文。对于AI算法有自己独特见解和经验…...
C#从入门到精通(34)—如何防止winform程序被同时打开多次
前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发上位机软件的过程中,评判一个人软件写的好不好,有一…...
Linux系统使用Docker部署Geoserver并做数据挂载进行地图服务的发布和游览
文章目录 1、前提环境2、拉取geoserver镜像3、创建数据挂载目录4、 运行容器5、 测试使用(发布shp数据为服务)5.1、创建工作区5.2、添加数据存储5.3、发布图层5.4、服务游览 1、前提环境 部署环境:Linux,Centos7 ,Doc…...
STM32-温湿度上传OneNET项目
一、项目需求 使用 ESP8266 连接 OneNET 云平台,并通过 MQTT 协议上传 DHT11 获取的温湿度值。 二、项目框图 三、DHT11工作原理 参考于良许嵌入式手把手教你玩转DHT11(原理驱动) | 良许嵌入式 3.1 正常工作验证 # 上电后ÿ…...
HTML 中的 Canvas 样式设置全解
在 HTML5 中,<canvas> 元素提供了一个强大的绘图接口,允许开发者通过 JavaScript 实现各种图形和动画效果。为了充分利用 <canvas> 的功能,理解其样式设置是至关重要的。本文将详细介绍如何在 HTML 中设置 <canvas> 的各种…...
【Java】File 类
目录 File 类File 类构造方法常见成员方法判断与获取创建与删除获取并遍历 File 类 File 对象表示一个路径,可以是文件的路径,也可以是文件夹的路径 这个路径可以是存在的,也允许是不存在的 绝对路径和相对路径的区别: 绝对路径…...
SAP S4HANA Administration (Mark Mergaerts Bert Vanstechelman)
SAP S4HANA Administration (Mark Mergaerts Bert Vanstechelman)...
特征提取:如何从不同模态中获取有效信息?
在多模态学习中,特征提取是一个至关重要的过程。它是将原始数据(如文本、图像、视频和语音等)转化为机器能够理解和处理的特征的核心步骤。不同于传统的单一模态任务,在多模态学习中,如何有效地从每种模态中提取出有意义的信息并进行融合,直接影响到最终模型的性能和准确…...
2025年-G14-Lc88-278.第一个坏版本 -java版
1.题目描述 第一个坏版本 你是一名产品经理,目前领导一个团队开发新产品。不幸的是,你产品的最新版本未通过质量检查。由于每个版本都是基于前一个版本开发的,所以坏版本之后的所有版本也都是坏的。假设你有 n 个版本 [1, 2, …, n]ÿ…...
计算机网络————(一)HTTP讲解
基础内容分类 从TCP/IP协议栈为依托,由上至下、从应用层到基础设施介绍协议。 1.应用层: HTTP/1.1 Websocket HTTP/2.0 2.应用层的安全基础设施 LTS/SSL 3.传输层 TCP 4.网络层及数据链路层 IP层和以太网 HTTP协议 网络页面形成基本 流程:…...
大语言模型架构:从基础到进阶,如何理解和演变
引言 你可能听说过像 ChatGPT 这样的 AI 模型,它们能够理解并生成自然语言文本。这些模型的背后有着复杂的架构和技术,但如果你了解这些架构,就能明白它们是如何工作的。今天,我们将用简单的语言,逐步介绍大语言模型的…...
科普mfc100.dll丢失怎么办?有没有简单的方法修复mfc100.dll文件
当电脑频繁弹窗提示“mfc100.dll丢失”或应用程序突然闪退时,这个看似普通的系统文件已成为影响用户体验的核心痛点。作为微软基础类库(MFC)的核心组件,mfc100.dll直接关联着Visual Studio 2010开发的大量软件运行命脉。从工业设计…...
什么是虚拟内存?它的作用是什么?
虚拟内存概念 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间)。但是实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在…...
SAP任命Simon Davies为亚太区总裁,领导重组后的亚太地区业务
2025年2月19日,SAP宣布任命Simon Davies为新任亚太区总裁,负责领导公司重组后的亚太地区业务。Davies将常驻新加坡,全面负责SAP在亚太地区的战略、运营、人员管理、销售、服务、合作伙伴关系及盈利能力。他的职责范围涵盖韩国、澳大利亚、新西…...
Markdown使用方法文字版解读
[TOC](这里写自定义目录标题) # Markdown编辑器 你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 ## 新的改变 我们对Markdown编辑器进行了…...
QT移植,交叉编译至泰山派RK3566开发板,.pro文件解析
备注 交叉编译到开发板,会有各种奇奇怪怪的问题, 直接命令行安装 QTCREATOR和 QtBase,就在板子上搞个桌面系统编译,最后把桌面关掉。 配置文件解析 配置文件丢这里,后面有空整理下。 说下大概的注意点, 安装路径(qtcreator远程部署的路径)、 动态库路径和…...
Liunx(CentOS-6-x86_64)系统安装MySql(5.6.50)
一:安装Liunx(CentOS-6-x86_64) 安装Liunx(CentOS-6-x86_64) 二:下载MySql(5.6.50) MySql下载官网 二:安装MySql 2.1 将mysql上传到Liunx 文件地址 /usr/local/ 2…...
使用 deepseek实现 go语言,读取文本文件的功能,要求支持 ascii,utf-8 等多种格式自适应
使用 deepseek实现 go语言,读取文本文件的功能,要求支持 ascii,utf-8 等多种格式自适应我要用 chatgpt,也问过,但是比 deepseek 还是差一个级别,具体如下: package mainimport ("bufio&qu…...
当电脑上有几个python版本Vscode选择特定版本python
查看当前vscode用的python版本命令 Import sys print(sys.version) 修改VSCODE解释器 打开 VSCode。 按下 CtrlShiftP打开命令面板。 输入 Python: Select Interpreter 并选择它。 从弹出的列表中选择你安装的 Python 解释器。如果你有多个 Python 版本(例如…...
大一计算机的自学总结:一维差分与等差数列差分
前言 差分和前缀和一样,也是很重要的基础算法。 一、一维差分 1.内容 当给出一个数组,每次操作让数组某个区间上的值全增加,最后要求返回整个数组的结果。若是一次一次去遍历,时间复杂度肯定很难看。差分可以做到在时间复杂度…...
学习dify第一天:整体架构分析
使用marscode AI插件 从分析最火的dify开始学习使用ai提速首先安装插件功能快捷键使用这个工具如何学习项目首先学习dify那就先上官网看文档开始从docker构建脚本学起看下docker-compose.yamldify里边服务的组件现在看api和web模块api项目根目录有Makefile文件,用于构建api和w…...
C语言的内存分配:malloc和free
使用库函数分配和管理内存。在运行时,分配更多的内存给程序使用,主要工具是malloc函数,这个函数接受一个参数:所需要要的内存字节数。malloc函数会找到合适的空闲内存块,这样的内存是匿名的,即malloc分配了…...
为什么 JSON 不能序列化 set
为什么 JSON 不能序列化 set JSON(JavaScript Object Notation)作为一种广泛使用的数据交换格式,虽然功能强大,但它无法直接序列化 set 类型。本文将从设计原理、实现限制和实际应用角度,探讨这一现象的原因及解决方案…...
XUnity.AutoTranslator-Gemini——调用Google的Gemini API, 实现Unity游戏中日文文本的自动翻译
XunityAutoTranslator-Gemini-API 本项目是一个使用 Flask 框架和 Google Gemini GenAI 模型构建的 Web API 服务,用于将日文unity游戏文本翻译成简体中文。 日文游戏文本AI翻译API (基于Google Gemini) 本项目是一个使用 Flask 框架和 Google Gemini GenAI 模型…...
深刻理解构件生产线
我们可以将构件生产线类比为软件开发中的一种高效、模块化的构建方式。下面,我将结合Java编程的概念来详细讲解构件生产线的含义和实现方式。 一、构件生产线的概念 构件生产线在软件开发中,类似于工厂中的自动化生产线,它通过将复杂的软件…...
nlp 自然语言处理+bert model +问答系统 question answer system(python 完整代码)
pre-trained bert model 预训练好的Bert模型 本地实现问答系统 用这条命令将bert下载到本地: model.save_pretrained("path/to/model") 也有参考这篇文章 https://colab.research.google.com/drive/1uSlWtJdZmLrI3FCNIlUHFxwAJiSu2J0-#scrollTo=AaweLnNXGhTY …...
【Excel】【VBA】根据内容调整打印区域
Excel VBA:自动调整打印区域的实用代码解析 在Excel中,我们经常需要调整打印区域。今天介绍一段VBA代码,它可以根据C列的内容自动调整打印区域。 Dim ws As Worksheet Dim lastRow As Long Dim r As Long 设置当前工作表 Set ws ActiveSh…...