Godot和GDScript可以将函数存储在变量中吗?

时间:2019-01-15 17:46:29

标签: function scripting godot gdscript

我对GDScript language的部分Godot文档感到困惑。它似乎自相矛盾。在页面的大约中间位置,在“引用函数”部分,它说您不能将函数存储在变量中,然后似乎立即自相矛盾。

Godot函数是否可以存储在变量中?

  

引用功能

     

与Python相反,函数不是GDScript中的一流对象。   这意味着 它们不能存储在变量中 ,不能作为参数传递给另一个函数或从其他函数返回。这是出于性能原因。

     

要在运行时按名称引用函数(例如, 例如将其存储在变量中 或将其作为参数传递给另一个函数),一个人必须使用调用或funcref助手:

1 个答案:

答案 0 :(得分:1)

GDScript函数不是像python中那样的对象。因此,您不能直接引用函数。

但是,您可以使用它们的关联实例按名称间接引用它们。

例如,具有以下功能:

func hello():
    print('Hello')

您可以按名称在实例上调用函数:

call('hello') # prints 'Hello'

您可以使用funcref()存储实例和名称:

var ref = funcref(hello_object_instance, 'hello')
ref.call_func() # prints 'Hello'
takes_func_ref_to_call_later(ref) # later, prints 'Hello'

FuncRef.call_func()object_instance.call()的作用相同,只是将其包装在一个对象中。

正因为如此,Object.connect()和朋友所示,回调函数才是这样的:

func deferred_finish(param1, param2, callback_obj, callback_func):
    # ... do something
    callback_ref = funcref(callback_obj, callback_func)
func _process(delta):
    if _finished:
        callback_ref.call_func()
func _enter_tree():
    deferred_finish('hello', 'world', self, 'finished_callback')

我希望这会有所帮助。让我知道您是否需要任何澄清。