2. 什么是2.5D?与2D/3D的区别
什么是2.5D?与2D/3D的区别
用大白话解释2.5D
2.5D(Two-and-a-half Dimensional)就是:用3D技术做出来、但玩起来像2D的游戏。
听起来有点绕?用舞台剧来打比方:
想象你坐在剧院里看舞台剧。舞台上的演员在真实的三维空间里走动,布景有前后层次,灯光有立体感。但是你作为观众,只能从固定的角度(正面)看这一切。你不能绕到舞台后面看,也不能从上面俯视。
这就是2.5D的本质:世界是3D的,但玩家的视角是固定的。
2D、2.5D、3D 的对比
| 特性 | 2D | 2.5D | 3D |
|---|---|---|---|
| 世界构成 | 平面图片 | 3D模型 | 3D模型 |
| 摄像机 | 固定/跟随(平面) | 固定角度 | 自由移动 |
| 玩家移动 | 平面移动 | 平面移动(受限) | 全方向移动 |
| 光影效果 | 手绘/贴图 | 实时3D光照 | 实时3D光照 |
| 开发难度 | 低 | 中 | 高 |
| 性能消耗 | 低 | 中 | 高 |
| 代表游戏 | 超级马里奥(早期) | 魂斗罗归来、3D割草 | 原神、塞尔达传说 |
2.5D的优势
比纯2D更有立体感
纯2D游戏的光影效果是画出来的,不会随着光源变化。2.5D游戏使用真实的3D光照,角色和场景会有真实的阴影、反光、环境光遮蔽(AO,一种让物体接缝处变暗的效果,让画面更有层次感)。
效果对比:
- 纯2D:角色的阴影是贴图上画的,永远不变
- 2.5D:角色的阴影随着光源移动而变化,更真实
比纯3D开发成本低
3D游戏需要:
- 完整的3D场景(所有角度都要做好)
- 复杂的摄像机控制系统
- 更多的碰撞体积设置
- 更复杂的AI寻路
2.5D游戏因为视角固定,可以:
- 只做玩家能看到的那一面
- 摄像机逻辑简单
- 碰撞可以简化为2D平面
- AI寻路在2D平面上计算
适合小团队和独立开发者
一个人或者几个人的小团队,用2.5D可以做出视觉效果接近3A游戏(大公司大制作游戏)的作品,但工作量只有3D游戏的一半左右。
2.5D的常见视角类型
横版卷轴(Side-scrolling)
代表游戏:魂斗罗、赤影战士、空洞骑士(2D版)、小丑牌
摄像机从侧面看,玩家左右移动,场景向左或向右滚动。
摄像机位置:
←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
[摄像机] ----→ [玩家] ----→ [场景向左滚动]
→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→特点:
- 最经典的2.5D视角
- 玩家只能左右移动(有时可以跳跃)
- 场景深度(前景/背景)增加立体感
在Godot中的实现:摄像机跟随玩家的X轴移动,Y轴固定或有限范围内移动。
using Godot;
// 横版卷轴摄像机控制器
public partial class SideScrollCamera : Camera2D
{
// 摄像机跟随的目标(通常是玩家)
[Export] private Node2D _target;
// 跟随速度(值越小越平滑,值越大越紧跟)
[Export] private float _followSpeed = 5f;
public override void _Process(double delta)
{
if (_target == null) return;
// 只跟随X轴,Y轴保持固定(横版游戏特性)
Vector2 targetPos = new Vector2(_target.GlobalPosition.X, GlobalPosition.Y);
// 平滑插值移动(Lerp:在两个值之间平滑过渡)
GlobalPosition = GlobalPosition.Lerp(targetPos, _followSpeed * (float)delta);
}
}extends Camera2D
# 摄像机跟随的目标(通常是玩家)
@export var target: Node2D
# 跟随速度(值越小越平滑,值越大越紧跟)
@export var follow_speed: float = 5.0
func _process(delta):
if not target:
return
# 只跟随X轴,Y轴保持固定(横版游戏特性)
var target_pos = Vector2(target.global_position.x, global_position.y)
# 平滑插值移动(lerp:在两个值之间平滑过渡)
global_position = global_position.lerp(target_pos, follow_speed * delta)俯视角(Top-down)
代表游戏:3D割草、挺进地牢、以撒的结合
摄像机从正上方(或略微倾斜)往下看,玩家可以360度移动。
摄像机位置:
↑(摄像机在上方往下看)
|
←←←[玩家]→→→
|
↓特点:
- 玩家可以向任意方向移动
- 视野范围大,适合大量敌人的游戏
- 场景设计相对简单(主要是地面)
在Godot中的实现:使用3D场景,摄像机放在高处朝下,或者直接使用2D场景。
using Godot;
// 俯视角玩家移动控制器
public partial class TopDownPlayer : CharacterBody3D
{
[Export] private float _speed = 5f;
public override void _PhysicsProcess(double delta)
{
// 获取输入方向(WASD或方向键)
Vector3 inputDir = Vector3.Zero;
inputDir.X = Input.GetAxis("ui_left", "ui_right");
inputDir.Z = Input.GetAxis("ui_up", "ui_down");
// 归一化(让斜向移动速度和直线移动速度一样)
if (inputDir != Vector3.Zero)
{
inputDir = inputDir.Normalized();
}
Velocity = inputDir * _speed;
MoveAndSlide();
}
}extends CharacterBody3D
@export var speed: float = 5.0
func _physics_process(delta):
# 获取输入方向(WASD或方向键)
var input_dir = Vector3.ZERO
input_dir.x = Input.get_axis("ui_left", "ui_right")
input_dir.z = Input.get_axis("ui_up", "ui_down")
# 归一化(让斜向移动速度和直线移动速度一样)
if input_dir != Vector3.ZERO:
input_dir = input_dir.normalized()
velocity = input_dir * speed
move_and_slide()等角视角(Isometric)
代表游戏:暗黑破坏神1/2、文明系列、模拟城市
摄像机从45度角斜上方看,场景呈现出菱形网格的视觉效果。
等角视角示意:
╱╲
╱ ╲
╱ ╲
╲ ╱
╲ ╱
╲╱特点:
- 能同时看到物体的顶面和两个侧面
- 视觉上有很强的立体感
- 常用于策略游戏和RPG(角色扮演游戏)
在Godot中的实现:使用3D场景,摄像机旋转到等角角度(通常是X轴旋转-45度,Y轴旋转45度)。
using Godot;
// 等角视角摄像机设置
public partial class IsometricCamera : Camera3D
{
public override void _Ready()
{
// 设置等角视角的标准角度
// X轴旋转:向下倾斜约35.26度(等角视角的标准角度)
// Y轴旋转:45度(让场景呈菱形)
RotationDegrees = new Vector3(-35.26f, 45f, 0f);
// 使用正交投影(让远近物体大小一样,没有透视缩放)
// 正交投影:就像用尺子量图纸,不会因为距离远近而变形
Projection = ProjectionType.Orthogonal;
Size = 10f; // 视野大小
}
}extends Camera3D
func _ready():
# 设置等角视角的标准角度
# X轴旋转:向下倾斜约35.26度(等角视角的标准角度)
# Y轴旋转:45度(让场景呈菱形)
rotation_degrees = Vector3(-35.26, 45.0, 0.0)
# 使用正交投影(让远近物体大小一样,没有透视缩放)
# 正交投影:就像用尺子量图纸,不会因为距离远近而变形
projection = Camera3D.PROJECTION_ORTHOGONAL
size = 10.0 # 视野大小固定视角(Fixed Camera)
代表游戏:生化危机1/2/3(经典版)、鬼泣(早期)
摄像机固定在特定位置,玩家进入不同区域时切换到不同的固定摄像机。
特点:
- 可以精心设计每个镜头的构图
- 制造紧张感和悬疑感(看不到摄像机外的东西)
- 开发工作量较大(每个区域需要单独设计摄像机)
经典2.5D游戏案例分析
3D割草(Vampire Survivors)
- 视角:俯视角2.5D
- 技术:2D精灵图(Sprite,就是一张会动的图片)+ 简单的3D光照
- 核心玩法:自动攻击 + 移动躲避 + 升级选择
- 为什么成功:核心循环简单但有深度,30分钟一局节奏紧凑
魂斗罗:归来(Contra: Return)
- 视角:横版卷轴2.5D
- 技术:3D模型 + 固定横版摄像机
- 核心玩法:移动 + 射击 + 躲避
- 为什么成功:继承经典手感,3D画面让老玩家耳目一新
暗黑破坏神2(Diablo II)
- 视角:等角视角2.5D
- 技术:预渲染背景 + 2D精灵角色
- 核心玩法:点击移动 + 技能释放 + 装备收集
- 为什么成功:装备系统的随机性让玩家停不下来
在Godot中选择2.5D的实现方式
Godot提供两种主要方式实现2.5D:
方式一:3D场景 + 固定摄像机(推荐)
使用Godot的3D功能,但把摄像机固定在特定角度。
优点:
- 真实的3D光照和阴影
- 可以使用3D物理
- 视觉效果最好
适合:横版动作、俯视射击、等角RPG
方式二:2D场景 + 3D效果模拟
使用Godot的2D功能,通过图层(Layer)和视差(Parallax,远处物体移动慢、近处物体移动快的效果)模拟3D感。
优点:
- 开发更简单
- 性能更好
- 适合像素风格
适合:像素风横版游戏、简单俯视游戏
using Godot;
// 视差背景控制器(模拟3D纵深感)
// 视差效果:就像坐车时,近处的树木快速后退,远处的山慢慢移动
public partial class ParallaxController : ParallaxBackground
{
// 摄像机或玩家的引用
[Export] private Node2D _followTarget;
// 视差强度(0=不移动,1=跟随目标完全同步)
[Export] private float _parallaxStrength = 0.5f;
public override void _Process(double delta)
{
if (_followTarget == null) return;
// 根据目标位置计算视差偏移
ScrollOffset = _followTarget.GlobalPosition * _parallaxStrength;
}
}extends ParallaxBackground
# 摄像机或玩家的引用
@export var follow_target: Node2D
# 视差强度(0=不移动,1=跟随目标完全同步)
@export var parallax_strength: float = 0.5
func _process(delta):
if not follow_target:
return
# 根据目标位置计算视差偏移
# 视差效果:就像坐车时,近处的树木快速后退,远处的山慢慢移动
scroll_offset = follow_target.global_position * parallax_strength小结
2.5D是一个甜蜜点:比纯2D更有视觉冲击力,比纯3D更容易开发。对于独立开发者来说,这是一个非常值得考虑的选择。
选择视角类型时,参考这个简单原则:
- 想做动作游戏 → 横版卷轴
- 想做射击/生存游戏 → 俯视角
- 想做策略/RPG → 等角视角
- 想做恐怖/剧情游戏 → 固定视角
下一章我们将讨论如何选择适合你游戏的美术风格。
