跟deepseek学godot

in STEEM CN/中文11 days ago

好的,没问题!这份Godot 3D节点介绍就是为你这样的初学者准备的。我们会像搭积木一样,从零开始理解最核心的节点。

Godot 3D 世界搭建指南:核心节点“全家桶”

想象一下,你要在Godot里搭建一个3D游戏场景,就像一个导演在布置舞台。下面这些节点就是你手头最重要的“演员”和“道具”。


1. Node3D - 万物的基石(舞台上的“坐标点”)

  • 通俗理解:这是所有3D节点的“老祖宗”。它自己看不见、摸不着,但它有三个最基本属性:位置(Position)、旋转(Rotation)、缩放(Scale)。你可以把它想象成舞台上一个隐形的“定位点”或“空物体”。
  • 核心作用
    • 作为父节点:你可以把很多其他节点(如模型、灯光)作为它的子节点。这样,当你移动、旋转或缩放这个 Node3D 时,它的所有子节点都会跟着一起动。这在管理复杂物体(比如一个由多个部分组成的机器人)时非常有用。
    • 空间变换:提供3D空间中的变换能力。
  • 什么时候用:当你需要将一个或多个物体“捆绑”在一起移动时,就创建一个 Node3D 作为它们的父节点。

2. MeshInstance3D - 视觉的呈现(舞台上的“演员”)

  • 通俗理解:这是让你看到3D模型的节点。它就是那个有形状、有颜色的东西,比如一个箱子、一个角色、一把剑。Mesh 就是“网格”,即模型的形状。
  • 核心作用:显示3D模型。你需要给它指定一个 Mesh 资源(比如一个 .obj 文件或在Godot中生成的立方体、球体等)。
  • 重要伙伴StandardMaterial3D(标准材质)。MeshInstance3D决定了模型的“形状”,而材质决定了它的“外表”(颜色、是否反光、是否透明、有没有贴图等)。
  • 什么时候用:任何时候你想在场景中放置一个可见的3D物体时。

3. Camera3D - 玩家的眼睛(摄影机)

  • 通俗理解:没有它,玩家就什么都看不见!它决定了玩家从哪个角度、以何种方式观察你的3D世界。
  • 核心作用:定义游戏的视图窗口。一个场景中必须至少有一个启用的 Camera3D,否则画面就是黑的。
  • 常用设置
    • Projection(投影):有“透视”和“正交”两种。绝大部分3D游戏用的是透视,这样才有近大远小的效果。
    • Fov(视野):相当于相机的广角程度,值越大,看到的范围越广。
  • 什么时候用:永远是场景中的必需品。通常把它作为可玩角色的子节点,或者放在一个固定的位置。

4. DirectionalLight3D - 太阳(平行光)

  • 通俗理解:就像现实世界中的太阳,它的光线是平行的,从一个方向照射整个场景,没有衰减。它的位置不重要,旋转角度才决定了光照方向。
  • 核心作用:为整个场景提供基础照明和明确的阴影方向。这是你最常用、也最应该首先添加的灯光。
  • 什么时候用:几乎每个3D场景都需要一个,用来模拟日光或主要的环境光源。

5. RigidBody3D - 物理的化身(服从物理定律的物体)

  • 通俗理解:如果你想做一个会掉落的箱子、被踢飞的球、或者一辆被撞飞的车,就用它。它是一个完全由物理引擎驱动的物体。你不需要直接移动它,而是通过施加力(Force)、冲量(Impulse)或者让它与其他物体碰撞来影响它。
  • 核心作用:模拟受重力、摩擦力、碰撞影响的真实物理物体。
  • 重要特性
    • 你可以监听它的 body_entered 信号来知道它被什么撞了。
    • 使用 apply_central_forceapply_impulse 来推它。
  • 什么时候用:任何需要真实物理效果的物体,比如掉落物、保龄球瓶、爆炸飞出的碎片。

6. CharacterBody3D - 可控的角色(玩家或NPC)

  • 通俗理解:这是专门为角色设计的节点,比如玩家、敌人、NPC。它不受物理引擎的完全控制,而是由你通过代码来驱动,但同时又能与物理世界进行碰撞检测
  • 核心作用:实现精确的角色移动,比如行走、奔跑、跳跃、爬梯子。它不会像 RigidBody3D 那样轻易被撞飞。
  • 核心方法move_and_slide()。这是它的灵魂!在你的代码中,你设置好角色的速度(velocity),然后每帧调用这个函数,Godot就会帮你处理移动和碰撞。
    # 这是一个非常典型的CharacterBody3D移动代码片段
    func _physics_process(delta):
        # 1. 计算水平速度(例如根据输入)
        velocity.x = input_dir.x * SPEED
        velocity.z = input_dir.z * SPEED
        
        # 2. 应用重力
        if not is_on_floor():
            velocity.y -= gravity * delta
            
        # 3. 执行移动和碰撞检测!
        move_and_slide()
    
  • 什么时候用做玩家角色时,99%的情况都用它!

7. StaticBody3D - 静止的世界(墙壁和地面)

  • 通俗理解:静止不动的、不可移动的物理物体。它是物理世界的“背景墙”。
  • 核心作用:为其他物理物体(RigidBody3DCharacterBody3D)提供碰撞表面。
  • 重要伙伴CollisionShape3D(碰撞形状)。一个 StaticBody3D 自己并没有碰撞体积,你必须为它添加一个或多个 CollisionShape3D 子节点,并指定形状(如立方体、球体、胶囊体),这样才能被其他物体“撞上”。
  • 什么时候用:所有静止的障碍物,如地面、墙壁、房屋、大型岩石。

8. CollisionShape3D - 看不见的边界(物理身体的形状)

  • 通俗理解:它是物理身体的“灵魂”。一个 RigidBody3DCharacterBody3DStaticBody3D 能不能被撞到,完全看它有没有这个子节点。
  • 核心作用:定义物理碰撞体的形状。这个形状可以比视觉上的 MeshInstance3D 更简单,以提升性能(比如用一个盒子来近似一个箱子的碰撞)。
  • 什么时候用:为你创建的任何一个物理身体(Static, Rigid, Character)添加它。

总结与快速上手流程

现在,我们来快速搭建一个最简单的场景:

  1. 创建场景根节点:默认就是一个 Node3D,我们叫它“舞台”。
  2. 添加地面
    • 在“舞台”下创建一个 StaticBody3D,命名为 “Ground”。
    • 给 “Ground” 添加一个子节点 MeshInstance3D,给它一个“BoxMesh”作为地面模型,并拉宽缩放。
    • 再给 “Ground” 添加一个子节点 CollisionShape3D,同样指定一个“BoxShape”,这样角色才能站在上面。
  3. 添加玩家
    • 在“舞台”下创建一个 CharacterBody3D,命名为 “Player”。
    • 给 “Player” 添加一个子节点 MeshInstance3D(比如一个胶囊体),这样你就能看到它。
    • 给 “Player” 添加一个子节点 CollisionShape3D(比如一个胶囊形状),这样它才能与地面碰撞。
    • 最后,给 “Player” 添加一个子节点 Camera3D,并调整好角度,这就是玩家的眼睛。
  4. 添加光照
    • 在“舞台”下创建一个 DirectionalLight3D,旋转它,让光线照亮你的场景。
  5. 写脚本
    • 选中 “Player” 节点,附加一个脚本,在里面使用上面提到的 move_and_slide() 代码来实现移动。

记住这个流程,你就已经掌握了Godot 3D开发最核心的骨架。不要试图一次性记住所有节点和它们的属性,多用、多试、多犯错,你就会飞速进步。祝你开发愉快!

Sort:  

Upvoted! Thank you for supporting witness @jswit.