来自官方Wiki:
Arma 3函数库的主要作用是在任务、战役或插件中可以更方便的调用函数。它可以自动运行,不需要函数模块。
与直接调用SQF文件相比,使用函数库有如下优点:
- 任务开始时自动编译为全局变量-无需记住文件的直接路径。
- 使用compileFinal的安全保护
- 可以直接在Functions Viewer中看到
- 更高级的调试选择
- 可选任务启动时立即执行,无需手动调用
- 潜在的性能改进
使用方法
在description.ext文件中配置一个CfgFunctions类,所有的函数配置均在这个类里面
也可以在Description.ext或CamportDescription.ext中配置指定任务和战役的功能,在Config.cpp中定义Addon函数。在这两种情况下,配置结构是相同的。
提醒:
在下文中所有的符号是游戏尝试加载函数文件的来源。这取决于CfgFunctions的位置
如果CfgFunctions在Description.ext中,就是任务的根目录
如果是Campaign Description.ext 则是战役的根目录
如果在Config中,就是游戏的根目录,这个函数的目录需要手动配置
示例:
class CfgFunctions
{
class TAG
{
class Category
{
class functionName {};
};
};
};
- 函数的名字就是 TAG_fnc_functionName
- 函数对应的目录
- 如果这段配置在Config中:
<Root>\Category\fn_functionName.sqf
- 如果在description.ext中:
<ROOT>\Functions\Category\fn_functionName.sqf
- 如果这段配置在Config中:
配置
一个函数库的配置一共有三个: Tag,Category,Function
Tag
Tag顾名思义是标签的意思
为了防止重复,每个开发者必须创建一个自己独一无二的tag,并在它下面创建函数,在组合函数名的时候将要使用tag的名字 例如: BIS_fnc_spawnGroup
class CfgFunctions
{
class TAG
{
class Category
{
class myFunction {};
};
};
class TAG_WeaponManagement
{
tag = "TAG"; // 这个函数的名字是TAG_fnc_myOtherFunction
class Category
{
class myOtherFunction {};
};
};
};
可配置属性
tag
tag属性的值将覆盖之前的tag
Category
Category顾名思义是类别的意思,类别属性会改变函数在FunctionsViewer(函数查看器)中的类别。它不会改变函数的名字,但是会改变函数的加载路径。
class CfgFunctions
{
class TAG
{
class Category
{
class myFunction {};
};
class OtherCategory
{
file = "My\Category\Path";
class myFunction {}; // 这个函数的加载路径为<ROOT>\My\Category\Path\fn_myFunction.sqf";
};
class DataCategory
{
requiredAddons[] = { "A3_Data_F" }; // requiredAddons配置会检查某个Addons是否加载,如果没加载将不会加载这个函数
class myDataFunction {};
};
};
};
可配置属性
file
file 配置会改变函数的加载路径
requiredAddons
requiredAddons配置会检查某个Addons是否加载,如果没加载将不会加载这个函数
Function
函数库中的函数
命名规则
函数的命名应该遵循小驼峰命名规则
✔TAG_fnc_myFunction
❌TAG_fnc_MyFunction
配置示例
class CfgFunctions
{
class TAG
{
class Category1
{
class myFunction {};
};
class Category2
{
file = "Path\To\Category";
class myFunction
{
file = "My\Function\Filepath.sqf"; // 函数将会加载在 <ROOT>\My\Function\Filepath.sqf", 而不是 "Path\To\Category"
};
class myFSMFunction
{
preInit = 1;
postInit = 1;
ext = ".fsm";
preStart = 1;
recompile = 1;
};
};
};
};
可配置属性
配置 | 描述 | 允许配置 |
---|---|---|
file | 用于手动配置加载路径,它将完全忽视上级配置的路径不会合并 | Description.ext✔config.cpp✔ |
preInit(以前称为“forced”) | 如果配置为1,将在初始化对象之前,在任务开始时调用函数。传递的参数是[“preInit”]。这个函数将在队列外执行。 | Description.ext✔config.cpp✔ |
postInit | 在初始化对象之后,可以将postInit属性设置为1,以便在任务开始时调用函数。传递的参数是["postInit", didJIP].这个函数将在队列中顺序运行,因此这个函数是可以暂停的,但是长时间的暂停会导致任务停止加载。 | Description.ext✔config.cpp✔ |
ext | 用于设置函数文件的类型默认为.sqf 还可以配置为.fsm | Description.ext✔config.cpp✔ |
headerType | 自行查看原文 | Description.ext✔config.cpp✔ |
preStart | 如果配置为1,这个函数将在标题页面之前,所有加载项加载之后调用. | Description.ext❌config.cpp✔ |
recompile | 如果配置为1,将在任务开始时重新编译函数(Description.ext中的函数总是在任务开始时编译) | Description.ext❌config.cpp✔ |
关于在config.cpp中配置的解释
- 这些属性会在任务启动的时候调用函数
- 任何的脚本错误都会阻止任务的正常加载
- 可能会有安全风险
由于本人英文水平限制,只能翻译成这样了.
原文链接: https://community.bistudio.com/wiki/Arma_3:_Functions_Library