Godot 引擎学习

9 阅读6分钟

Godot 引擎学习路径整理

本文整理自多篇优质博客文章,按照从入门到进阶的学习路径进行组织


目录

  1. 基础阶段
  2. 进阶阶段
  3. 推荐资源汇总

基础阶段

一、熟悉编辑器界面

1.1 界面布局概览

Godot 编辑器采用模块化布局,主要包含以下区域:

区域位置功能说明
菜单栏顶部文件、编辑、项目等主要操作
工具栏上方运行/暂停/停止,场景保存,2D/3D/脚本切换
场景树左侧面板显示当前场景的节点层级结构
文件系统左侧面板管理项目资源(图片、音频、脚本等)
主视图区中央2D/3D 场景编辑器或脚本编辑器
检查器右侧面板编辑选中节点的属性
底部面板底部输出日志、调试器、动画/音频工具
1.2 核心面板详解

场景树(Scene Tree)

  • 显示当前场景中的所有节点及其层级关系
  • 支持拖拽调整节点父子关系
  • 右键菜单可添加子节点、重命名、删除等操作

检查器(Inspector)

  • 显示和编辑选中节点的所有属性
  • 支持实时修改并预览效果
  • 可展开/折叠属性分组

文件系统(FileSystem)

  • 管理项目中的所有资源文件
  • 支持新建、导入、删除、重命名操作
  • 拖拽资源到场景树可快速创建对应节点
1.3 实用技巧
  • 快捷键Ctrl+Shift+P 切换预设布局
  • 独立窗口:右键 Dock 标签可"Undock",双屏效率更高
  • 快速运行F6 运行当前场景,F5 运行主场景

参考文章


二、理解节点系统

2.1 核心概念

节点(Node)

  • Godot 中最基本的构建块,就像乐高积木
  • 每个节点有特定功能:Sprite2D 显示图片、AudioStreamPlayer 播放音频
  • 节点可以包含子节点,形成树状结构
  • 父节点的变换会影响所有子节点

场景(Scene)

  • 节点的容器,用于组织节点层级
  • 场景文件后缀为 .tscn
  • 一个场景可以嵌套另一个场景(类似 Prefab)
  • 建议一个功能/界面一个场景,通过嵌套复用
2.2 常用节点类型
节点类型用途典型应用场景
Node2D2D 场景根节点2D 游戏主场景
Sprite2D显示 2D 图片游戏角色、背景
CharacterBody2D角色物理体玩家角色、NPC
Area2D区域检测触发器、收集品
CollisionShape2D碰撞形状与物理体配合使用
Label显示文本UI 文字、分数显示
Camera2D2D 摄像机跟随玩家视角
2.3 场景树与信号

场景树(Scene Tree)

  • 游戏运行时所有节点的层级结构
  • 通过 get_tree() 访问场景树
  • 可以切换场景、暂停游戏等

信号(Signal)

  • Godot 的观察者模式实现
  • 用于节点间松耦合通信
  • 可在编辑器中连接,也可用代码连接
# 代码连接信号示例
$Area2D.body_entered.connect(_on_body_entered)

func _on_body_entered(body):
    print("物体进入区域:", body.name)

参考文章


三、学习 GDScript

3.1 语言特点

GDScript 是 Godot 专为游戏开发设计的脚本语言:

  • 语法简洁:类似 Python,缩进表示代码块
  • 类型灵活:支持动态和静态类型
  • 深度集成:与 Godot API 无缝衔接
  • 学习曲线平缓:专为游戏场景设计
3.2 基础语法

变量与类型

# 动态类型
var health = 100
var player_name = "Hero"

# 静态类型(推荐)
var speed: float = 200.0
var is_alive: bool = true
var inventory: Array[String] = ["sword", "shield"]

函数定义

func move(direction: Vector2, delta: float) -> void:
    position += direction * speed * delta

func take_damage(amount: int) -> int:
    health -= amount
    return health

条件与循环

# 条件判断
if health <= 0:
    die()
elif health < 30:
    show_warning()
else:
    continue_game()

# 循环
for i in range(5):
    spawn_enemy()

while is_game_running:
    process_game_logic()
3.3 生命周期函数
函数调用时机用途
_ready()节点首次进入场景树初始化代码
_process(delta)每帧调用持续更新的逻辑
_physics_process(delta)固定频率调用物理相关逻辑
_input(event)收到输入事件时处理玩家输入
extends CharacterBody2D

@export var speed: float = 300.0

func _ready():
    # 初始化
    print("玩家已准备就绪")

func _physics_process(delta):
    # 处理移动
    var direction = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
    velocity = direction * speed
    move_and_slide()
3.4 学习资源推荐

参考文章


四、制作简单 2D 游戏

4.1 官方教程:Dodge the Creeps!

Godot 官方提供的第一个 2D 游戏教程,涵盖:

  • 创建完整的 2D 游戏项目结构
  • 玩家角色移动与动画
  • 随机生成敌人
  • 计分系统
  • 游戏状态管理

项目结构建议

project/
├── assets/          # 游戏资源
│   ├── sprites/     # 图片素材
│   ├── sounds/      # 音频文件
│   └── fonts/       # 字体文件
├── scenes/          # 场景文件
│   ├── player.tscn
│   ├── enemy.tscn
│   ├── hud.tscn
│   └── main.tscn
├── scripts/         # 脚本文件
│   ├── player.gd
│   ├── enemy.gd
│   └── main.gd
└── project.godot    # 项目配置
4.2 核心机制实现

玩家移动

extends CharacterBody2D

@export var speed: float = 400.0

func _physics_process(delta):
    var velocity = Vector2.ZERO
    
    if Input.is_action_pressed("move_right"):
        velocity.x += 1
    if Input.is_action_pressed("move_left"):
        velocity.x -= 1
    if Input.is_action_pressed("move_down"):
        velocity.y += 1
    if Input.is_action_pressed("move_up"):
        velocity.y -= 1
        
    if velocity.length() > 0:
        velocity = velocity.normalized() * speed
        
    move_and_slide()

碰撞检测

# 使用 Area2D 检测收集品
extends Area2D

func _on_body_entered(body):
    if body.is_in_group("player"):
        # 增加分数
        GameState.add_score(10)
        # 销毁自己
        queue_free()
4.3 学习建议
  1. 从模仿开始:跟着官方教程一步步做
  2. 理解原理:不要只复制代码,理解每行代码的作用
  3. 动手修改:尝试修改参数,看效果变化
  4. 独立实现:关闭教程,凭记忆重新实现

参考文章