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

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

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

🎯 本课学习目标

经典入门 3D 小游戏:用方向键滚一个球,收集金币到达终点。本课完成前半部分。

📖 详细教学步骤

游戏设计设计

  • 玩家:一个球(RigidBody3D)
  • 操作:方向键/AD 施加力让球滚动
  • 目标:收集金币,滚到终点
  • 视觉:第三人称跟随相机 + 天空

创建球搭建

  1. 新建场景,根节点 RigidBody3D,命名 Ball,保存 ball.tscn
  2. 子节点 MeshInstance3D + SphereMesh(半径 0.5)
  3. 子节点 CollisionShape3D + SphereShape3D(半径 0.5)
  4. 材质:鲜艳的球(Albedo 红色 + 粗糙度低)
  5. 挂脚本 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)

搭建关卡地面搭建

  1. 新建 main3d.tscn,根节点 Node3D
  2. 加 StaticBody3D 地面:MeshInstance3D + BoxMesh(20×1×20)+ CollisionShape3D + BoxShape3D
  3. 加 WorldEnvironment(天空)和 DirectionalLight3D(太阳)
  4. 把球实例放进场景

金币搭建

金币场景(Area3D):

  1. 新建场景,根节点 Area3D,命名 Coin,保存 coin3d.tscn
  2. MeshInstance3D + SphereMesh(黄色发光材质,半径 0.4)
  3. CollisionShape3D + SphereShape3D
  4. 加旋转动画:脚本让金币自转
  5. 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()

测试测试

  1. 放 5 个金币在地面各处
  2. F5 运行:方向键滚球、吃金币、观察物理手感
  3. 调 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 与粗糙度调节。