代码结构,面向对象 (OOP)

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