您似乎对 Game Maker 的工作方式有些困惑,所以我会在解决实际问题之前尝试解决这个问题。
GML 是一个头脑简单的野兽,它只知道两种数据类型:字符串和数字。其他所有内容(对象、精灵、脚本、数据结构、实例等)在您的 GML 代码中都用数字表示。
例如,您可能有一个名为“Player”的对象,其中包含各种花哨的事件,但对代码而言,Player 只是一个常数,您可以(例如)使用show_message(string(Player)); 打印出来
现在,函数script_execute(script) 将应该执行的脚本的ID 作为参数。那个ID只是一个普通的号码。 script_execute 将在某个内部表中找到具有该 ID 的脚本,然后运行该脚本。
换句话说,如果您碰巧知道close_dialog 的 ID 是 14,那么您也可以调用 script_execute(14),而不是调用 script_execute(close_dialog)(尽管这是不好的做法,因为它使代码难以了解并应对 ID 更改)。
现在应该很明显,首先将close_dialog 的数值分配给一个变量,然后在该变量上调用script_execute 是完全可以的。最后,script_execute 只关心传递的数字,而不关心这个数字来自的变量的名称。
如果您想得有点远,您可能想知道当时是否需要script_execute,或者您是否可以这样做:
script = close_dialog;
script();
在我看来,在语言中允许这样做是非常好的,但它不起作用 - 函数调用运算符实际上确实关心你尝试调用的东西的名称。
现在,有了这个背景,我们来回答您的实际问题。如果close_dialog 实际上是一个脚本,那么您建议的代码将可以正常工作。如果它是扩展函数(或内置函数——我不拥有 Studio,所以我知道什么),那么它实际上没有 ID,你不能用 script_execute 调用它。事实上,你甚至不能将close_dialog 分配给一个变量,因为它在 GML 中没有任何值——你所能做的就是调用它。不过,要解决这个问题,您可以创建一个脚本(例如,close_dialog_script,它只调用close_dialog,然后您可以像上面一样使用它。
编辑:由于它似乎无论如何都不起作用,请检查您是否有名称为 close_dialog 的其他资源(可能是按钮精灵)。这种冲突可能意味着close_dialog 为您提供了精灵的 ID,而不是脚本的 ID,而直接调用脚本仍然可以工作。