大阔
发布于 2022-01-04 / 111 阅读 / 0 评论 / 0 点赞

Arma3-函数库(Wiki翻译)

来自官方Wiki:

Arma 3函数库的主要作用是在任务、战役或插件中可以更方便的调用函数。它可以自动运行,不需要函数模块。

与直接调用SQF文件相比,使用函数库有如下优点:

  1. 任务开始时自动编译为全局变量-无需记住文件的直接路径。
  2. 使用compileFinal的安全保护
  3. 可以直接在Functions Viewer中看到
  4. 更高级的调试选择
  5. 可选任务启动时立即执行,无需手动调用
  6. 潜在的性能改进

使用方法

在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

配置

一个函数库的配置一共有三个: 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还可以配置为.fsmDescription.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





评论