创建一个扩展

要创建一个扩展,你首先需要右击RMB Icon资源浏览器中的任何地方,选择创建-扩展。这将在工作区中为你新创建的资源打开扩展属性。

Extension Properties如果你没有看到这个,你可以在资源浏览器中双击你的扩展资源来打开它的属性窗口,或者在它已经打开的情况下关注它。

现在已经准备好让你添加所需的文件和功能,你也可以在这里给扩展名(按照通常的惯例,只有字母/数字,除了下划线"_",没有特殊符号)。如果你愿意,你还可以为扩展设置版本号。

在 "Copies To "下,你可以选择这个扩展被导出的平台。对于一个简单的GML扩展,你不需要担心这个问题,因为它将在所有平台上运行,然而,如果你正在创建一个特定平台的扩展(如Android),那么你需要确保它不要导出到任何不兼容的平台(如iOS,控制台等)。

占位符文件

要向新的扩展名添加文件,你需要点击菜单图标Estension Options Icon 并选择一个占位符文件("添加占位符")或导入目标平台所需的实际文件("添加文件")。

Add Files To An Extension

一个 "通用 "占位符是一个可以是任何类型的文件,除了那些特定平台所要求的(例如没有DLLSO文件),它将不会被使用,除了作为一个 "链接器 "文件来连接一组函数或常量与给定的扩展(通常它只用于iOS和Android扩展,这将在下面的章节解释这些目标)。你还可以添加 "GML "和 "JS "占位符文件,以便更具体地使用。

添加文件

通常情况下,你不需要使用占位符,除非你是为iOS和Android构建的,所以你会选择 "添加文件" 选项,根据他们的目标平台,添加以下任何一个文件。

你会注意到,没有AndroidiOS的文件类型,这是因为它们的设置略有不同。再往下看,你可以找到关于如何设置它们的解释,但首先让我们看看如何为任何一个目标平台创建一个普通的GML扩展,因为这个过程对所有这些平台都是一样的。

创建一个GML扩展

首先,你需要创建将被使用的文件。对于GML扩展,这将是一个文本文件(以.gml为扩展名保存),其格式是这样的:

#define c_alice_blue
return make_color_rgb(240,248,255);


#define instance_create_colour
var i = instance_create_layer(argument0, argument1, argument2, argument3);
with (i)
{
    image_blend = argument3;
}
return i;

正如你所看到的,我们以一个#define的调用开始每个部分,在上面的例子中,它被用来定义两个函数。让我们来看看定义函数的每一部分。

如果你要写一个DLL或JavaScript扩展,那么这个过程将是类似的,但要用正确的语言来写扩展的文件格式。

一旦你完成了这些,你需要将文件添加到扩展名中(使用 "添加文件 "选项),这将为文件属性的扩展名链出一个新窗口。

File Property Window

在这里,你将选择扩展的目标平台(对于GML你将选择它们全部),以及重命名扩展文件和设置其他一些细节,我们稍后会介绍这些。

注意:将文件添加到扩展名中会将其复制到项目目录中,这意味着任何进一步的修改都必须在该副本中进行,以便在游戏中看到它们。你可以在资源浏览器中右键点击你的扩展名,并选择"在资源管理器中打开"来找到该副本。

添加功能

编辑器应该自动填入我们的GML文件中的函数,但如果没有,你可以通过点击函数菜单按钮Estension Options Icon,选择你所需要的,手动添加它们。

Add functions/Constants To An Extension

选择"添加函数"将允许您向扩展添加函数,然后可以在GameMaker中调用该函数,与任何内置函数相同。添加函数后,将打开以下窗口,供您定义函数属性(或者您可以双击函数打开它):

Function Editor

在上图中,我们在函数编辑器中填入了我们在GML扩展文件中定义的函数instance_create_colour()的详细信息(注意,这个函数编辑器窗口并不只是用来定义GML函数的--它在所有扩展类型中都是一样的)。让我们来看看可以为一个函数定义的每个选项。

注意 如果函数是Windows、Mac或Ubuntu的原生扩展的一部分(分别为dll、dylib等),并且它有四个以上的参数,则所有参数必须是相同类型的。

一旦你完成了所有这些,那么这个函数就可以在项目中使用了; 它现在会以自动完成的形式显示,并且还会有颜色编码:

定义的函数也可以被设置为初始函数最终函数,这意味着它们将在游戏开始(初始)和游戏结束(最终)时被自动调用。

重要 所有平台都支持 Init 函数调用,但不是所有平台都会执行 Final 函数调用。这是因为某些平台会直接关闭应用程序,而不给任何通知或时间让这个函数被调用。受此影响的平台主要是 iOSAndroidHTML5PlayStationXbox

你的另一个选择是创建一个。宏可以是一个常量 值,也可以是一个简短的代码片段(关于宏的更多信息,请参见这里)。例如,我们可以从之前定义的GML扩展中删除c_alice_blue 函数,而将其改为宏。要创建一个宏,你可以简单地点击扩展属性中的 "宏 "按钮,它将打开以下窗口。

Macro Editor

这里的编辑器几乎是不言自明的:你给出宏的名称和它的常量值,或者一行简短的代码。注意,如果该宏是一行代码,那么每次调用该宏时都会重新运行代码

创建扩展选项

点击"扩展选项"旁边的齿轮图标,创建或修改你的扩展选项。

在确认提示上点击""后,你会看到一个新的窗口,在这里你可以添加新的扩展选项。

你可以给每个扩展选项一个名称,一个默认值,和一个数据类型。名称是你在扩展代码中内部使用的,用来检索该选项的值。

除了使用 "添加选项 "添加选项外,您还可以使用 "添加章节 "添加章节。 章节不是一个选项,而只是显示在扩展编辑器主窗口的一个标题。如果你有很多选项,想清理最终用户看到的选项列表,可以使用这个方法。

可以创建以下类型的选项:

你也可以点击一个选项旁边的  齿轮图标,给它一个可选的显示名称描述(在悬停在显示名称上时以工具提示出现)。

在额外窗口中,你也可以选择将这个选项导出到与游戏捆绑的options.ini文件中。

最后,你可以选择从编辑器中隐藏该选项,让使用该扩展的终端用户看不到它。

使用扩展选项

你可以通过使用 扩展函数在运行时检索扩展的选项值。

您还可以使用标识符YYEXTOPT_<扩展名>_<选项名>条件注入期间和编译器批处理文件/目录中检索扩展选项。请记住,由于这些选项是在编译时执行的,因此扩展选项的值将作为字符串检索。

注意 您也可以在编译器批处理文件/脚本中使用扩展版本号,使用名称 GMEXT_<ExtensionName>_version

只有当扩展有在运行时使用的功能时,扩展选项才会在运行时可用。然而,无论扩展的使用情况如何,选项将始终被导出到INI文件(如果选项被启用)和批处理脚本中。

代理文件

当使用多个目标平台时,值得注意的是,你可以创建一个只有一套函数/宏的单一扩展,它将在所有平台上工作。这可以通过在你的游戏中只添加一个链接库作为扩展,并将其他链接库放入扩展属性窗口的代理文件列表中来实现。

例如,假设你有一个Windows扩展的dll "Haggis.dll"。你可以简单地将这个dll 复制为Mac的DyLib,将其命名为"libHaggis.dylib",并确保内部函数名称与原Windows dll一致。然后,这个DyLib将被添加到代理文件中,当游戏在Mac目标上运行时被设置为导出,GameMaker将在调用扩展函数时自动使用它。

要添加代理文件,只需单击“属性”窗口中所选资源文件的Add Argument Icon按钮,然后浏览到文件位置。一旦它被添加,你可能需要更新扩展的目标添加适当的模块,当你下一次运行你的游戏,它将包括作为该平台的代理。您也可以通过单击将删除所选代理文件的Remove Argument Icon按钮来删除代理文件。

一旦你添加了你的代理文件,它们将被复制到你的项目的Extensions文件夹中(你可以通过右击RMB Icon 扩展名,选择在资源管理器中打开找到它们),所以如果你需要编辑它们,你应该编辑与游戏捆绑的复制文件而不是导入的源文件,因为GameMaker将使用项目中的文件进行编译。

命名规则

你的代理文件必须遵循下面列出的命名规则,这一点非常重要,因为GameMaker会解析这些名称,并根据文件的扩展名和名称为文件分配目标模块,并自动为你链接文件。如果你不遵循这些约定,你的游戏在运行时可能无法工作,因为GameMaker将无法确定要使用哪个文件,所以它将无法正常加载文件。

下面给出了每个目标平台的命名惯例:

平台名称
Windows 32bit Runtime<Name>.dll, lib<Name>.dll
Windows 64bit Runtime<Name>_x64.dll, lib<Name>_x64.dll
Ubuntu (Linux)<Name>.so, lib<Name>.so,
<Name>_linux.so, lib<Name>_linux.so,

<Name>_arm.so, lib<Name>_arm.so,
lib<Name>_linux_arm.so,

<Name>_arm64.so, lib<Name>_arm64.so, lib<Name>_linux_arm64.so,

<Name>_arm64-v8.so,
lib<Name>_arm64-v8.so, lib<Name>_linux_arm64-v8.so,

<Name>_armeabi-v7a.so, lib<Name>_armeabi-v7a.so, lib<Name>_linux_armeabi-v7a.so
macOS<Name>.dylib, lib<Name>.dylib
HTML5<Name>.js
PS4<Name>.prx, lib<Name>.prx, <Name>_ps4.prx, lib<Name>_ps4.prx
PS5<Name>.prx, lib<Name>.prx, <Name>_ps5.prx, lib<Name>_ps5.prx
Xbox One<Name>.dll, <Name>_xboxone.dll
Xbox Series X|S<Name>.dll, <Name>_xboxseriesxs.dll

使用上述惯例,你要把<Name>部分换成你要添加代理文件的基础文件的名称。