【Godot】【入门】GDScript 快速上手(只讲游戏里最常用的 20% 语法)

省去学完语言再做游戏的时间,只给做 Godot 游戏必用的语法:变量、流程控制、节点路径、信号、资源加载、时间/协程。看完即可读写常见脚本。

基础心法:类即脚本、节点即对象

  • 每个 .gd 文件都是一个类,默认继承 Nodeextends 的类型。
  • 脚本挂在节点上运行,节点即实例;脚本里的生命周期函数(如 _ready_process)由引擎回调。

变量与类型

gdscript 复制代码
var hp := 100              # 推导类型
var speed: float = 200.0   # 显式类型
const MAX_HP := 200        # 常量
  • := 让编译器推导类型并保持静态检查;= 则是动态。
  • 数组与字典:
gdscript 复制代码
var inventory: Array = []
var config := {"name": "player", "attack": 10}

函数与返回

gdscript 复制代码
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): ...

流程控制(够用版)

gdscript 复制代码
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:
gdscript 复制代码
match state:
    STATE_IDLE: idle()
    STATE_MOVE: move()
    _: push_warning("unknown state")

节点路径与 onready

  • 获取子节点:$Spriteget_node("Sprite")
  • @onready var 在场景加载完再赋值,避免节点未就绪:
gdscript 复制代码
@onready var sprite: Sprite2D = $Sprite
  • 访问父节点:get_parent();访问根:get_tree().root

信号(最常用部分)

定义自定义信号

gdscript 复制代码
signal hit(damage)

发射信号

gdscript 复制代码
func _on_area_entered(body):
    emit_signal("hit", 10)

连接信号

  • 图形化:Node 面板连接。
  • 代码:
gdscript 复制代码
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:
gdscript 复制代码
var bullet = BulletScene.instantiate()
add_child(bullet)
bullet.global_position = global_position

时间与协程(await)

  • 计时器:await get_tree().create_timer(1.0).timeout;或节点 Timer
  • 动画/节奏控制:
gdscript 复制代码
func dash():
    can_move = false
    velocity = dash_dir * 600
    await get_tree().create_timer(0.2).timeout
    can_move = true
  • yield 在 Godot 4 改为 await,记得用新的写法。

数学与向量常用片段

gdscript 复制代码
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 上使用。

数组/字典操作速查

gdscript 复制代码
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_speedspawn_enemy()
  • 导出变量用 @export,便于在 Inspector 调参。
  • 逻辑复用优先 PackedScene + 代码连接信号,少在编辑器硬连。

实战示例:计时开门

gdscript 复制代码
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 示例项目。
相关推荐
Libraeking2 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
子春一2 小时前
Flutter for OpenHarmony:构建一个 Flutter 四色猜谜游戏,深入解析密码逻辑、反馈算法与经典益智游戏重构
算法·flutter·游戏
市场部需要一个软件开发岗位2 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
前端不太难3 小时前
HarmonyOS 游戏上线前必做的 7 类极端场景测试
游戏·状态模式·harmonyos
JMchen1234 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
微祎_4 小时前
Flutter for OpenHarmony:构建一个 Flutter 重力弹球游戏,2D 物理引擎、手势交互与关卡设计的工程实现
flutter·游戏·交互
crmscs5 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob5 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔5 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei9965 小时前
flutter和Android动画的对比
android·flutter·动画