省去学完语言再做游戏的时间,只给做 Godot 游戏必用的语法:变量、流程控制、节点路径、信号、资源加载、时间/协程。看完即可读写常见脚本。
基础心法:类即脚本、节点即对象
- 每个
.gd文件都是一个类,默认继承Node或extends的类型。 - 脚本挂在节点上运行,节点即实例;脚本里的生命周期函数(如
_ready、_process)由引擎回调。
变量与类型
var hp := 100 # 推导类型
var speed: float = 200.0 # 显式类型
const MAX_HP := 200 # 常量
:=让编译器推导类型并保持静态检查;=则是动态。- 数组与字典:
var inventory: Array = []
var config := {"name": "player", "attack": 10}
函数与返回
func move(dir: Vector2) -> void:
position += dir * 200 * get_process_delta_time()
func add(a: int, b: int) -> int:
return a + b
-> void可省略,但写上有助检查。- 支持默认参数、可选参数:
func spawn(count := 1): ...
流程控制(够用版)
if hp <= 0:
die()
elif hp < 50:
heal(10)
else:
attack()
for enemy in enemies:
enemy.take_damage(5)
while stamina > 0:
sprint()
match类似 switch:
match state:
STATE_IDLE: idle()
STATE_MOVE: move()
_: push_warning("unknown state")
节点路径与 onready
- 获取子节点:
$Sprite或get_node("Sprite")。 @onready var在场景加载完再赋值,避免节点未就绪:
@onready var sprite: Sprite2D = $Sprite
- 访问父节点:
get_parent();访问根:get_tree().root。
信号(最常用部分)
定义自定义信号
signal hit(damage)
发射信号
func _on_area_entered(body):
emit_signal("hit", 10)
连接信号
- 图形化:Node 面板连接。
- 代码:
func _ready():
var btn := $Button
btn.pressed.connect(_on_btn_pressed)
func _on_btn_pressed():
print("clicked")
资源加载与实例化
- 预加载(编译期加载,性能好):
const BulletScene := preload("res://Bullet.tscn") - 运行时加载:
var tex = load("res://icon.png") - 实例化 PackedScene:
var bullet = BulletScene.instantiate()
add_child(bullet)
bullet.global_position = global_position
时间与协程(await)
- 计时器:
await get_tree().create_timer(1.0).timeout;或节点Timer。 - 动画/节奏控制:
func dash():
can_move = false
velocity = dash_dir * 600
await get_tree().create_timer(0.2).timeout
can_move = true
yield在 Godot 4 改为await,记得用新的写法。
数学与向量常用片段
var dir = (target - global_position).normalized()
look_at(target)
var lerp_pos = global_position.lerp(target, 0.1)
var clamped = clamp(value, 0, 1)
- 物理运动常用:
move_and_slide()、is_on_floor()在CharacterBody2D/3D上使用。
数组/字典操作速查
var arr = [1,2,3]
arr.append(4)
arr.erase(2)
arr.shuffle()
arr.map(func(x): return x * 2)
var dict = {"hp": 100}
dict["hp"] -= 10
for k in dict.keys():
print(k, dict[k])
- 新语法:
for i in arr.size():可直接遍历索引。
你真正用到的重点场景生命周期:
_ready():节点进入场景树后执行一次,适合初始化、信号连接。_process(delta):每帧执行,适合非物理逻辑。_physics_process(delta):固定帧率执行,适合运动/碰撞。_input(event):原始输入事件;常结合accept_event()阻断。
错误信息与调试
print()输出,push_warning()提醒,push_error()终止。- 断点与 Inspector 实时改值:脚本编辑器左侧打断点,运行后可在 Inspector 实时调整变量。
- 常见报错:
Invalid get index 'xxx':节点路径写错或未初始化。Attempt to call function '...' in base 'null instance':变量为 null,检查@onready或加载时机。
代码规范最小集合
- 节点名称使用帕斯卡命名法,变量/函数用 snake_case:
player_speed、spawn_enemy()。 - 导出变量用
@export,便于在 Inspector 调参。 - 逻辑复用优先 PackedScene + 代码连接信号,少在编辑器硬连。
实战示例:计时开门
extends Area2D
signal opened
@export var open_delay := 2.0
@onready var door_sprite := $Door
var opened_flag := false
func _on_body_entered(body):
if opened_flag:
return
opened_flag = true
await get_tree().create_timer(open_delay).timeout
door_sprite.visible = false
emit_signal("opened")
- 覆盖了信号定义/发射、await、节点路径、导出变量,是 80% 小功能的写法模板。
总结复盘
- 记住 7 件事:变量写
:=、@export调参、@onready找节点、信号 connect、preload场景、await create_timer控节奏、_process/_physics_process分情况用。 - 遇到报错先检查节点路径和 null,再看是否在
_ready之后访问;掌握这些即可读懂大部分 Godot 示例项目。

2123

被折叠的 条评论
为什么被折叠?



