HOME / 第 5 部分 · 3D 游戏开发 / 第 59 课
MODULE 5 · 3D 游戏开发

第 59 课 · 3D 小游戏实战:滚球闯关(二)

⏱ 预计时长 50 分钟📊 难度 进阶📚 模块 第 5 部分 · 3D 游戏开发

🎯 本课学习目标

完成滚球游戏:UI 得分、掉出重置、通关判定与结束界面。

📖 详细教学步骤

HUD 得分搭建

  1. 在 main3d.tscn 加 CanvasLayer → Label 显示得分(第 27 课)
  2. 球脚本加得分变量与公开方法:
GDSCRIPTextends RigidBody3D

var score: int = 0
@onready var hud_label: Label = $"../../HUD/ScoreLabel"  # 按你的层级调整

func add_score(points: int):
    score += points
    hud_label.text = "得分: " + str(score)

掉出重置代码

球掉出世界时重置回起点:

GDSCRIPTvar start_pos: Vector3

func _ready():
    start_pos = global_position

func _physics_process(delta):
    ...
    # 掉出世界(Y < -10)就重置
    if global_position.y < -10:
        reset()

func reset():
    linear_velocity = Vector3.ZERO   # 清速度
    angular_velocity = Vector3.ZERO
    global_position = start_pos      # 回到起点

终点触发器搭建

终点:一个 Area3D 区域:

  1. 场景加 Area3D + BoxShape3D 一个大区域 + 绿色发光可视化
  2. 球进入终点区域 → 通关:
GDSCRIPTextends Area3D

func _ready():
    body_entered.connect(_on_body_entered)

func _on_body_entered(body):
    if body.is_in_group("player"):
        body.win()

通关处理代码

球脚本:

GDSCRIPTfunc win():
    print("通关!得分:", score)
    # 显示结束面板
    hud_label.get_parent().show_win(score)
    # 冻结球不再乱滚
    freeze = true

结束面板搭建

  1. HUD 加 Panel + Label(通关文字)+ Button(再玩一次)
  2. 默认隐藏,通关时显示
  3. 再玩一次按钮:重载场景
GDSCRIPTfunc _on_restart_pressed():
    get_tree().reload_current_scene()

完整测试与打磨测试

  1. 完整玩一遍:滚球 → 吃金币 → 通关 → 再玩一次
  2. 调场景氛围:天空、光照、金币数量
  3. 加音效:滚动摩擦声、金币叮声(第 44 课)
  4. 处理所有报错

🎉 你的第一个完整 3D 游戏完成!

⚠️
球掉出后没重置?

确认重置逻辑在 _physics_process 里每帧检测,且 start_pos 在 _ready 里已记录。

⚠️
通关后球还在动?

通关时设 freeze = true 或 linear_velocity = ZERO。

🧪 动手试一试

🏋️ 课后练习

为滚球游戏加「倒计时」:60 秒内通关,超时游戏结束,通关时显示剩余时间与得分。

var time_left=60; _process 里递减;time_left<=0 时调用失败逻辑。

💡

3D 物理游戏玩的就是手感,多试几组力/阻尼参数。

💡

给球加音效(滚动/碰撞)能显著提升质感。

🎓 本课小结

滚球闯关完整版:HUD 得分 + 掉出重置 + 终点触发通关 + 结束面板重开;至此你已完成一个完整 3D 游戏。