4.6 2026-01-27
面向对象挺拗口的,简单理解成GDScript有很多现成的模板,我们基于现成的模板扩展一些就可以用。
比如我写一个精灵(Sprite),就可以直接基于Sprite2D扩展,在里边加上我们需要的代码。
# 超类
extends Sprite2D
# 属性
var speed : float = 10.0
# 函数
func _process(delta: float) -> void:
if Input.is_action_just_pressed("ui_left"):
print("move left")
position.x -= speed
elif Input.is_action_just_pressed("ui_right"):
print("move right")
position.x += speed
注意三个部分
extends表示我们继承了哪个超类,意味着拥有Sprite2D所有的功能,在此基础上实现我们的功能。
var部分是当前脚本可以使用的属性,就是数据,比如这里定义了移动速度。
func部分是当前脚本可以调用的函数,就是行为,比如这里的固定用法_process()会在每帧被游戏引擎调用,实现根据左右按键进行打印日志和移动。
这里可以看到,我们使用了超类(Sprite2D)中的属性position,这个位置属性是一个Vector2类型的属性,二维向量包含x和y两个float类型的坐标,我们通过修改位置(position)属性实现移动这个精灵(Sprite2D)。
除了可以把类(class)直接添加到场景树中,也可以动态创建新实例
# 继承超类
extends "res://path/to/character.gd"
# 加载脚本
var Character = load("res://path/to/character.gd")
# 实例化
var character_node = Character.new()
# 加入场景树后就可以显示,并进入引擎的循环
add_child(character_node)
# 进入删除队列,当前帧完全后执行释放
character_node.queue_free()
为类型指定图标(icon)和类名(class_name)
@icon("res://interface/icons/item.png")
class_name Item
# 构造方法,创建实例时自动调用,进行初始化
func _init():
pass