变量
变量是代码中用来存放数据的基本单位(抛开计算机底层不谈),游戏中会变的数据都是变量。
玩家的生命值、游戏分数这种直观看到的数字是变量,玩家的位置、任务进度这种抽象的数据也是变量。
在 GDScript 中使用 var
关键字声明变量,它的基本语法格式如下:
var <变量名> [: 类型] [= <初始值>]
[!tip] 语法格式解读
本文中使用上面这种格式展示语法,其中
尖括号
引用的内容表示必须填写,并把尖括号内的东西换成该填入的字符,例如<变量名>
就表示这里必须要写一个变量名,至于名字是什么你可以自己来定。方括号表示可选填写,例如 var 语句中的
类型
和初始值
就可以省略。
变量声明示例
var 玩家名称 # 单纯声明一个变量,存储值为空,后续可以存储任意类型的数据。
var 玩家生命值 = 100 # 声明变量初值为 100,后续可以存储任意数据类型的数据。
var 敌人名称: String # 声明变量初值为空,并限定类型为字符串,后续只能存储该类型的数据。
var 敌人生命值: int = 100 # 声明变量初值并同时限定类型为整数,后续只能存储改类型的数据。
# 若指定了初始值,使用 `:=` 语法可以自动推导变量类型,等价于上一种变量声明格式,后续只能存储该类型的数据。
var 战斗回合数 := 300 # 等价于 var 战斗回合数: int = 300
关于变量类型我们会在下一节讲解。
变量声明的位置
方法体的内部和外部都可以声明变量,但实际作用不同(具体参见[作用域]章节):
var 生命值 = 100 # 放在了 _ready 的外面
func _ready():
var 生命值 = 100 # 放在了 _ready 的里面
当放在方法外面,也就是文件最外层时,表示这个变量属于当前节点,也就是说这个节点现在拥有了生命值
这个属性,这个变量随着节点一起出现和消失。
当放在方法里面时,这个变量就成了一个临时变量,当方法被执行,程序运行到 var 语句这一行时就会创建这个变量,当方法执行完毕时,这个变量就会自动消失。
因此可以感觉到,如果要处理一个持续的数据,应该把变量的声明放在方法的外面。
变量赋值
现在假设咱们给节点声明了生命值
这个变量,现在希望它每帧扣除一滴血,这时就可以使用变量赋值语句来修改变量的值,赋值语句格式如下:
<变量名> = <新的值>
可见其实就是把 var 关键字去掉了而已,既然这样,实现扣除一滴血的代码就可以这样写:
func _process(delta):
生命值 = 生命值 - 1
由于 _process 是每帧执行一次,所以上面代码就实现了每帧扣除一点血。
注意不要在前面加上 var,否则就成了每帧声明一个新变量。
[!tip] 什么是关键字
关键字就是指 GDScript 中具有特殊含义的一些单词,例如 var,他就表示创建变量。
[!tip] 中文变量名
Godot 从 v4.0-beta15 的开始支持 Unicode 编码(万国码标识符,包含中文编码)。但大多数人更喜欢英文变量名,本文为了阅读方便考虑(我怕我英语渣闹笑话)采用汉字变量名。
[!tip] 声明?创建?
在 生命值 这个例子中声明就等于创建,但不要和后面要学到的创建(实例化)对象搞混。
[!note] 变量名命名规则
上面提到了,变量名是自己起的,但很明显不能乱起,例如我让一个变量叫 var,这肯定很怪,所以变量名有以下规则:
不能使用数字开头
不能包含特殊字符,例如空格、加号等(唯一支持的符号是下划线 _)
不能和关键字重复
本文为了阅读方便,将尽量使用中文命名,这样读者可以根据变量名快速区分 Godot 内置变量和我们定义的变量,不过在一般的开发中,变量名还是以英文为主。
变量名的一个特例,match 是个关键字,但是变量名可以为 match。当然,我们都不推荐这类同名,因为容易混淆。