GDScript中函数也叫方法或模块,与变量一样,包括自定义函数与内置函数。大部分内置函数可以对游戏内容产生实质性影响,少部分函数比较特殊。
一、函数定义
在Godot中,我们使用“func”来定义函数,后面跟函数名、括号和冒号,下面一行缩进跟一个“pass”,这个“pass”并无任何意义,只是一个函数的结构。
函数的命名规则与变量的命名规则一致,打头的必须是字母或下划线,组成元素必须为字母、数字、下划线。
函数有三个关键信息,分别是输入信息、处理流程和处理结果。
二、函数调用
函数也是属于不同对象的,所以我们在调用函数时也必须指明函数的所属。我们在Godot中写下如下代码:
运行,即可看到编译器输出了“Hello”,证明函数调用成功。
这里的“self.”代表此函数是节点内部的,此处可省略。
我们再在Godot中写下如下代码:
编译运行后,可以看到输出了2,而没有输出“Hello”,这是因为在函数add中,我们已经把c的值“return”了出去,所以下一行代码就不会执行了。打开警告栏,可以看到编译器对代码发出了警告:
在这里,“add”函数被我们改造成了带参函数。当我们调用add函数时,需要传给它两个实参,而add函数在这里的作用是将两个值相加,并返回。
在具体代码中,a和b为形参,传入的(1,1)为实参。具体概念可查看相关文档。在这里,我们不仅可以定义所需参数的个数,也可以定义所需参数的类型,还可以给参数设定一个默认值,当调用时没有值传入就会使用默认值:
可以看到,运行结果为17。
我们也可以给它传值,此时会覆盖原有的默认值:
可以看到,输出结果为3而不是17。
我们不仅可以定义所需参数的类型,也可以定义整个函数的类型:
在函数定义之后加一个“->”,指向一种类型,然后运行,可以看到结果是5,小数部分被舍掉了。
三、虚函数与内置虚函数
虚函数是指没有实际处理流程的函数,这部分函数的内容可以由我们自行编写。而内置虚函数则是指Godot的制作组规定了特定名称却没有实际处理流程的函数。节点内的虚函数会在特定的条件下自动被触发。
例如:
条件1:当节点本身或其周围节点状态发生改变时,节点内部的某些虚函数就会被触发,如:
- 节点创建
- 节点进入“场景树”
- 节点离开“场景树”
- 节点死亡前
- 节点的子节点全部加入场景树
条件2:当场景树的状态发生改变时,且节点自身处于“树”下。如:
- 画面刷新
- 物理引擎刷新
- 硬件设备输入
条件3:其他情况
常用虚函数:
- _init:当节点被创建时进行调用的虚函数
- _ready:节点的所有子节点加入场景树时调用的虚函数
- _process: 每当画面刷新时(每一帧)调用的虚函数
- _physic_process:物理引擎刷新时调用的虚函数
需要注意的是,3和4两个函数内部都有一个名为delta的参数,代表距离上次画面刷新或物理引擎刷新所经过的时间。
四、函数中的变量
每一个函数都有一个内部的作用域,在一个函数内部定义的变量无法在另一个函数中直接访问。在函数运行结束时,函数内部的变量会自动销毁。在某些情况下,变量所代表的数据不会自动销毁,但变量一定会自动销毁。