当前位置: 首页 > news >正文

从2D到3D:用Godot4做你的第一个跳跃踩怪游戏(上)

从2D到3D:用Godot4打造你的首个跳跃踩怪游戏(上)

1. 3D游戏开发的基础准备

当你第一次从2D转向3D游戏开发时,最直观的变化就是坐标系统的扩展。在2D中我们熟悉的(x,y)坐标系,在3D中变成了(x,y,z)的三维空间。这种维度提升带来的不仅是技术层面的差异,更是一种思维方式的转变。

关键概念对比

特性2D环境3D环境
坐标系(x,y)(x,y,z)
摄像机固定视角或简单跟随需要明确设置投影方式
碰撞检测基于矩形或圆形基于立方体或球体
移动逻辑通常只考虑平面移动需要考虑重力加速度

在Godot4中,3D节点的命名通常以"3D"结尾,这与2D节点形成明显区别。例如:

  • SpriteMeshInstance3D
  • Area2DArea3D
  • CollisionShape2DCollisionShape3D
# 2D移动代码示例 velocity = Vector2(100, 0) move_and_slide() # 3D移动代码对应修改 velocity = Vector3(100, 0, 0) move_and_slide()

提示:在3D开发中,Y轴通常代表垂直方向,这与2D中Y轴向下为正的约定不同,需要特别注意。

2. 搭建基础游戏场景

2.1 创建3D游戏世界

首先我们需要建立一个基本的3D环境。与2D不同,3D场景必须包含以下几个核心元素:

  1. 地面碰撞体:防止角色掉落
  2. 光照系统:让3D模型可见
  3. 摄像机:决定玩家视角

创建地面的步骤

  1. 添加StaticBody3D节点(重命名为Ground)
  2. 为其添加CollisionShape3D子节点
  3. 设置碰撞形状为BoxShape3D,尺寸调整为(60,2,60)
  4. 添加MeshInstance3D作为视觉表现,同样使用BoxMesh
# 地面节点结构 Main (Node3D) └── Ground (StaticBody3D) ├── CollisionShape3D └── MeshInstance3D

2.2 设置3D摄像机

3D摄像机比2D复杂得多,需要考虑投影方式(透视/正交)、视野角度和位置。对于平台跳跃游戏,正交投影往往更适合:

# 摄像机设置建议 Camera3D: Projection: Orthogonal Size: 19 Position: (0, 19, 19) Rotation: (-45, 0, 0)

注意:正交投影消除了透视变形,使距离判断更准确,特别适合需要精确跳跃的游戏。

3. 创建可控制的3D角色

3.1 角色场景构建

3D角色通常使用CharacterBody3D作为根节点,这与2D中的CharacterBody2D对应。关键组件包括:

  • 视觉表现:通过MeshInstance3D显示3D模型
  • 碰撞形状CollisionShape3D定义物理边界
  • 控制脚本:处理移动和交互逻辑
# 玩家节点结构 Player (CharacterBody3D) └── Pivot (Node3D) └── Character (MeshInstance3D) └── CollisionShape3D

3.2 输入系统配置

Godot的输入映射系统在3D中同样适用,但移动逻辑需要调整:

  1. 在项目设置中创建输入动作:

    • move_left/move_right (对应x轴)
    • move_forward/move_back (对应z轴)
    • jump (对应y轴)
  2. 绑定按键时考虑多设备支持:

    • 键盘:WASD+空格
    • 手柄:左摇杆+按键A

3.3 3D移动逻辑实现

3D移动代码需要考虑重力影响和地面检测:

extends CharacterBody3D @export var speed = 14 @export var jump_force = 20 @export var fall_acceleration = 75 func _physics_process(delta): var direction = Vector3.ZERO # 获取输入方向 if Input.is_action_pressed("move_right"): direction.x += 1 if Input.is_action_pressed("move_left"): direction.x -= 1 if Input.is_action_pressed("move_back"): direction.z += 1 if Input.is_action_pressed("move_forward"): direction.z -= 1 # 处理移动和跳跃 if direction != Vector3.ZERO: direction = direction.normalized() $Pivot.look_at(position + direction) velocity.x = direction.x * speed velocity.z = direction.z * speed # 跳跃和重力 if is_on_floor() and Input.is_action_just_pressed("jump"): velocity.y = jump_force elif not is_on_floor(): velocity.y -= fall_acceleration * delta move_and_slide()

技巧:使用is_on_floor()检测地面接触,这是实现跳跃机制的关键。

4. 设计3D敌人系统

4.1 敌人场景配置

敌人同样使用CharacterBody3D,但行为模式与玩家不同:

  1. 基本结构与玩家类似
  2. 添加VisibleOnScreenNotifier3D用于离屏销毁
  3. 移动逻辑改为自动向玩家方向移动
# 敌人节点结构 Mob (CharacterBody3D) └── Pivot (Node3D) └── Character (MeshInstance3D) └── CollisionShape3D └── VisibleOnScreenNotifier3D

4.2 敌人行为脚本

敌人需要实现以下功能:

  • 生成时面向玩家
  • 随机移动方向和速度
  • 离开屏幕后自动销毁
extends CharacterBody3D @export var min_speed = 10 @export var max_speed = 18 func initialize(start_position, player_position): look_at_from_position(start_position, player_position, Vector3.UP) rotate_y(randf_range(-PI/4, PI/4)) # 随机偏移角度 var random_speed = randi_range(min_speed, max_speed) velocity = Vector3.FORWARD * random_speed velocity = velocity.rotated(Vector3.UP, rotation.y) func _physics_process(delta): move_and_slide() func _on_visible_on_screen_notifier_3d_screen_exited(): queue_free()

4.3 碰撞检测优化

3D碰撞检测比2D更消耗资源,可以通过以下方式优化:

  1. 使用简单的碰撞形状(球体或立方体)
  2. 合理设置物理层(Physics Layers)
  3. 及时销毁不可见的敌人
# 碰撞层设置示例 CollisionLayer: - 1: Player - 2: Enemy - 3: Ground CollisionMask: Player: 2,3 # 只与敌人和地面碰撞 Enemy: 1,3 # 只与玩家和地面碰撞

在游戏测试过程中,我发现3D碰撞盒的大小需要特别注意 - 太大玩家会觉得不公平,太小又会导致难以命中。经过多次调整,最终确定碰撞盒比视觉模型小约10%效果最佳。

http://www.jsqmd.com/news/756242/

相关文章:

  • 量子储层计算:超导电路实现与金融时序分析应用
  • 2026年4月有实力的测厚仪厂商推荐,铸件拉力试验机/金相试样磨抛机/10吨组合蝶形弹簧试验机,测厚仪企业推荐 - 品牌推荐师
  • 排查dom4j SAXReader报错‘前言中不允许有内容’?先检查你的BOM和空白符!
  • 【大润发购物卡】快速回收线上平台:省时高效的最佳选择 - 团团收购物卡回收
  • 分期乐额度回收安全吗?米米收正规平台保障无忧 - 米米收
  • 中南财经政法大学考研辅导班推荐:排名深度评测与选哪家分析 - michalwang
  • 从收音机到手机快充:二极管钳位电路在真实产品里是怎么用的?
  • CST电磁仿真后处理实战:手把手教你计算天线TRP/TIS与人体SAR值
  • SCMP补考政策是什么? - 众智商学院官方
  • Autovisor:三步实现智慧树网课自动化学习的终极指南
  • 徒步玄奘之路:新沙州文旅用文化解码打造心灵朝圣之旅 - 新沙州文旅
  • 大语言模型推理优化:SimKO的探索与利用平衡策略
  • WeChatExporter终极教程:3步完成iOS微信聊天记录本地备份
  • 西安电子科技大学考研辅导班推荐:排名深度评测与选哪家分析 - michalwang
  • Zotero GPT:5分钟打造你的AI文献助手,让学术效率提升300%
  • 告别虚拟机!在Ubuntu 20.04 LTS物理机上配置PCAN-USB设备完整工作流
  • 告别环境噩梦:用Docker容器化一键部署XTDrone仿真环境(支持PX4 v1.13)
  • 从33.5M到满速:一次FPGA网卡XDMA发送性能瓶颈的深度排查与优化实战
  • 北京大学医学部考研辅导班推荐:排名深度评测与选哪家分析 - michalwang
  • 2026年05月04日最热门的开源项目(Github)
  • 暨南大学考研辅导班推荐:排名深度评测与选哪家分析 - michalwang
  • 武汉大学考研辅导班推荐:排名深度评测与选哪家分析 - michalwang
  • 使用 Taotoken 后如何在 Ubuntu 终端便捷查看各模型用量与费用
  • AI 率 60% 的硕士论文——降 AI 软件按 3 工具叠加方案推荐。
  • 创意总监技能树:从专业执行到战略领导的全方位能力模型
  • 大润发购物卡回收攻略:2026年最新线上平台推荐 - 团团收购物卡回收
  • 别再死记硬背了!用Python写个购物车和登录系统,新手也能秒懂if/else
  • 瑞祥商联卡怎么变现?盘点常用的三种方案 - 团团收购物卡回收
  • Krita AI Diffusion:数字绘画的革命性智能辅助工具
  • 为什么选择大润发购物卡快速回收?线上平台教你一站式操作! - 团团收购物卡回收