HOME / 第 5 部分 · 3D 游戏开发 / 第 58 课
MODULE 5 · 3D 游戏开发
第 58 课 · 3D 小游戏实战:滚球闯关(一)
🎯 本课学习目标
- 综合运用 3D 物理与相机
- 实现滚球玩法
- 搭好关卡与目标
经典入门 3D 小游戏:用方向键滚一个球,收集金币到达终点。本课完成前半部分。
📖 详细教学步骤
游戏设计设计
- 玩家:一个球(RigidBody3D)
- 操作:方向键/AD 施加力让球滚动
- 目标:收集金币,滚到终点
- 视觉:第三人称跟随相机 + 天空
创建球搭建
- 新建场景,根节点
RigidBody3D,命名 Ball,保存 ball.tscn - 子节点 MeshInstance3D +
SphereMesh(半径 0.5) - 子节点 CollisionShape3D + SphereShape3D(半径 0.5)
- 材质:鲜艳的球(Albedo 红色 + 粗糙度低)
- 挂脚本 ball.gd
滚球控制代码
施加力让球滚动:
GDSCRIPTextends RigidBody3D
@export var force: float = 12.0
func _physics_process(delta):
# 读取方向键输入
var dir = Input.get_vector("move_left", "move_right",
"move_forward", "move_back")
# 在水平面施加力(X 和 Z)
var force_vec = Vector3(dir.x, 0, dir.y) * force
apply_central_force(force_vec)
搭建关卡地面搭建
- 新建 main3d.tscn,根节点 Node3D
- 加 StaticBody3D 地面:MeshInstance3D + BoxMesh(20×1×20)+ CollisionShape3D + BoxShape3D
- 加 WorldEnvironment(天空)和 DirectionalLight3D(太阳)
- 把球实例放进场景
金币搭建
金币场景(Area3D):
- 新建场景,根节点
Area3D,命名 Coin,保存 coin3d.tscn - MeshInstance3D + SphereMesh(黄色发光材质,半径 0.4)
- CollisionShape3D + SphereShape3D
- 加旋转动画:脚本让金币自转
- body_entered 检测球进入 → 加分 + 消失
GDSCRIPTextends Area3D
func _ready():
body_entered.connect(_on_body_entered)
func _process(delta):
rotate_y(2.0 * delta) # 金币自转
func _on_body_entered(body):
if body.is_in_group("player"):
body.add_score(10)
queue_free()
测试测试
- 放 5 个金币在地面各处
- F5 运行:方向键滚球、吃金币、观察物理手感
- 调 force 大小控制灵敏度
🎉 滚球核心玩法完成,下一课做终点和 UI!
⚠️
球一直打滑/刹不住?
调整球材质 Roughness(越高越抓地)和 Force 大小;可加线性阻尼(Damping)。
⚠️
球滚出地面?
地面要够大,或加「掉出重置」逻辑(第 59 课)。
🧪 动手试一试
🏋️ 课后练习
在关卡里放 10 个金币,实现金币自转 + 拾取加分 + 消失,并调整滚球手感(力 8-15 之间试)。
apply_central_force(Vector3(dir.x, 0, dir.y) * force)。
💡
RigidBody3D 的力在 _physics_process 每帧施加才有持续加速感。
💡
给球材质加一点金属/低粗糙度,滚动更真实。
🎓 本课小结
滚球 = RigidBody3D 球 + 方向键施力 + 第三人称场景 + Area3D 金币;物理手感靠 force 与粗糙度调节。