HOME / 第 5 部分 · 3D 游戏开发 / 第 59 课
MODULE 5 · 3D 游戏开发
第 59 课 · 3D 小游戏实战:滚球闯关(二)
🎯 本课学习目标
- 加入 HUD 与得分显示
- 实现掉出重置与通关判定
- 整合出完整可玩的滚球游戏
完成滚球游戏:UI 得分、掉出重置、通关判定与结束界面。
📖 详细教学步骤
HUD 得分搭建
- 在 main3d.tscn 加 CanvasLayer → Label 显示得分(第 27 课)
- 球脚本加得分变量与公开方法:
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 区域:
- 场景加 Area3D + BoxShape3D 一个大区域 + 绿色发光可视化
- 球进入终点区域 → 通关:
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
结束面板搭建
- HUD 加 Panel + Label(通关文字)+ Button(再玩一次)
- 默认隐藏,通关时显示
- 再玩一次按钮:重载场景
GDSCRIPTfunc _on_restart_pressed():
get_tree().reload_current_scene()
完整测试与打磨测试
- 完整玩一遍:滚球 → 吃金币 → 通关 → 再玩一次
- 调场景氛围:天空、光照、金币数量
- 加音效:滚动摩擦声、金币叮声(第 44 课)
- 处理所有报错
🎉 你的第一个完整 3D 游戏完成!
⚠️
球掉出后没重置?
确认重置逻辑在 _physics_process 里每帧检测,且 start_pos 在 _ready 里已记录。
⚠️
通关后球还在动?
通关时设 freeze = true 或 linear_velocity = ZERO。
🧪 动手试一试
🏋️ 课后练习
为滚球游戏加「倒计时」:60 秒内通关,超时游戏结束,通关时显示剩余时间与得分。
var time_left=60; _process 里递减;time_left<=0 时调用失败逻辑。
💡
3D 物理游戏玩的就是手感,多试几组力/阻尼参数。
💡
给球加音效(滚动/碰撞)能显著提升质感。
🎓 本课小结
滚球闯关完整版:HUD 得分 + 掉出重置 + 终点触发通关 + 结束面板重开;至此你已完成一个完整 3D 游戏。