Unity 2D 完整入门教程:从零开始制作一个平台跳跃游戏
本教程将带你了解 Unity 2D 开发的核心概念,包括:

- 场景与项目管理
- 精灵与动画
- 物理系统
- C# 脚本编程
- 碰撞检测与响应
- 预制件
第一部分:准备工作与项目设置
安装 Unity
如果你还没有安装 Unity,请访问 Unity 官网 下载并安装 Unity Hub,然后通过 Hub 安装最新的 LTS (长期支持) 版本,2025.3.x 或 2025.3.x,LTS 版本更稳定,适合开发项目。
创建新项目
- 打开 Unity Hub。
- 点击 “新建项目” (New Project)。
- 选择 2D (Core) 模板,这个模板会自动为你配置好 2D 项目所需的一切,2D 渲染管线和物理设置。
- 为你的项目命名(
2DPlatformer),选择一个位置保存,然后点击 “创建项目” (Create project)。
熟悉 Unity 界面
创建项目后,你会看到几个主要的窗口:
- Scene (场景视图):你用来摆放和编辑游戏对象的地方,像一张设计图。
- Game (游戏视图):玩家最终看到的游戏画面,是场景的实时预览。
- Hierarchy (层级视图):显示当前场景中所有游戏对象的列表,像一个家族树。
- Project (项目视图):显示你的项目所有文件,如脚本、图片、音频等。
- Inspector (检查器视图):显示在 Hierarchy 中选中对象的详细属性和组件。
第二部分:创建游戏场景与角色
准备资源
我们需要一些图片(精灵)来制作我们的游戏,你可以自己绘制,也可以在网上寻找免费的 2D 游戏素材,推荐网站:
为了方便,我们将使用 Unity 自带的一些资源,它们位于 Project 窗口 -> Packages -> 2D Pixel Pack -> Sprites 目录下。

创建地面
- 在
Project窗口中,找到Packages->2D Pixel Pack->Sprites->Backgrounds->Tilemaps->Colored。 - 找到
Ground精灵,按住鼠标左键拖拽到Scene视图中。 - 在
Inspector窗口中,调整Transform组件下的Position(X: 0, Y: -3, Z: 0) 和Scale(X: 10, Y: 1, Z: 1),让它看起来像一条长长的地面。
创建玩家
- 同样在
Project窗口中,找到Packages->2D Pixel Pack->Sprites->Characters->Player。 - 找到
Player精灵,拖拽到Scene视图中,放在地面上方。 - 调整玩家的
Position(X: 0, Y: 0, Z: 0)。
添加物理组件 (关键步骤)
为了让我们的角色能够受重力影响并与地面发生碰撞,我们需要给它添加物理组件。
- 在
Scene视图中选中Player对象。 - 在
Inspector窗口中,点击 “添加组件” (Add Component)。 - 添加
Rigidbody 2D组件,这个组件会让物体拥有质量、速度,并受到物理引擎的影响。 - 再次点击 “添加组件”,添加
Collider 2D->Box Collider 2D组件,这个组件定义了物体的碰撞边界,物理引擎会用它来检测碰撞。
重要提示:
Rigidbody 2D和Collider 2D是 2D 物理的核心。玩家、敌人等需要移动的物体,需要Rigidbody 2D,而 地面、墙壁等静态障碍物,只需要Collider 2D即可。
为地面添加碰撞体
- 选中我们之前创建的
Ground对象。 - 为它添加
Box Collider 2D组件,因为地面是静止的,所以不需要Rigidbody 2D。
运行游戏(点击顶部工具栏的播放按钮),你会发现玩家会因为重力掉到地面上,并停在那里,这很好!
第三部分:编写玩家控制脚本
现在让我们让玩家动起来。

创建 C# 脚本
- 在
Project窗口中,右键点击一个空白处,选择Create->C# Script。 - 将脚本命名为
PlayerController。 - 双击
PlayerController脚本,它会在你默认的代码编辑器(如 Visual Studio)中打开。
编写移动代码
将下面的代码复制并粘贴到 PlayerController.cs 文件中:
using UnityEngine;
public class PlayerController : MonoBehaviour
{
// [SerializeField] 允许在 Inspector 中看到并修改这个私有变量的值,但其他脚本无法直接访问。
[SerializeField] private float moveSpeed = 5f;
[SerializeField] private float jumpForce = 10f;
// 我们将使用 Rigidbody 2D 来控制玩家,所以在这里声明一个变量。
private Rigidbody2D rb;
// 用于检测玩家是否在地面上,防止二段跳。
[SerializeField] private Transform groundCheck;
[SerializeField] private LayerMask groundLayer;
private bool isGrounded;
// Start is called before the first frame update
void Start()
{
// 获取附加到此游戏对象的 Rigidbody 2D 组件。
rb = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
// --- 水平移动 ---
// Input.GetAxis("Horizontal") 会返回 -1 (左), 0 (不动), 1 (右)
float horizontalInput = Input.GetAxis("Horizontal");
// Vector2.right 是 (1, 0),乘以速度和输入值,得到水平方向的速度。
rb.velocity = new Vector2(horizontalInput * moveSpeed, rb.velocity.y);
// --- 跳跃 ---
// 检测玩家是否按下了空格键,并且在地面上。
if (Input.GetButtonDown("Jump") && isGrounded)
{
// AddForce 是给 Rigidbody 施加一个力,ForceMode2D.Impulse 表示这是一个瞬间的冲量,适合用于跳跃。
rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
}
}
// FixedUpdate 是用于处理物理逻辑的固定帧率更新函数,与 Update 分离,物理计算更稳定。
void FixedUpdate()
{
// 在 FixedUpdate 中检测地面,避免在 Update 中频繁进行物理检测。
isGrounded = Physics2D.OverlapCircle(groundCheck.position, 0.1f, groundLayer);
}
// OnDrawGizmos 是一个Unity的调试函数,只在Scene视图中绘制。
// 我们用它来可视化地面检测的范围。
void OnDrawGizmosSelected()
{
if (groundCheck != null)
{
Gizmos.color = Color.green;
Gizmos.DrawWireSphere(groundCheck.position, 0.1f);
}
}
}
应用脚本并设置地面检测
- 回到 Unity,选中
Player对象。 - 将
Project窗口中的PlayerController脚本拖拽到Player对象的Inspector窗口中。 - 你会看到脚本组件出现在
Inspector中,moveSpeed和jumpForce的值可以调整。 - 我们需要一个“地面检测点”,在
Hierarchy中右键Player,选择Create Empty,这会创建一个空的子对象。 - 将这个新对象重命名为
GroundCheck。 - 选中
GroundCheck,在Inspector中调整其Position为(X: 0, Y: -0.5, Z: 0),让它位于玩家脚下的位置。 - 回到
Player对象,你会发现PlayerController组件出现了Ground Check的字段,将GroundCheck对象拖拽到这个字段里。 - 设置层级:我们需要告诉脚本哪些图层是地面。
- 在
Hierarchy中选中Ground对象。 - 在
Inspector窗口的顶部,找到Layer下拉菜单,选择Add Layer...。 - 在
User Layer 8(或其他空白行) 中输入Ground。 - 再次选中
Ground对象,在Layer下拉菜单中选择我们刚刚创建的Ground层。 - 回到
Player对象,在PlayerController组件中,将Ground Layer字段设置为Ground。
- 在
测试控制
运行游戏!你应该可以使用 A/D 或 左/右方向键 来左右移动,使用 空格键 来跳跃了!
第四部分:添加敌人与碰撞检测
一个没有敌人的游戏是无聊的,我们来添加一个简单的敌人。
创建敌人
- 在
Project窗口中,找到Packages->2D Pixel Pack->Sprites->Enemies->Slime。 - 将
Slime精灵拖拽到Scene视图中,放在地面上。 - 为
Slime添加Rigidbody 2D和Box Collider 2D组件。
创建敌人移动脚本
- 创建一个新的 C# 脚本,命名为
EnemyController。 - 将以下代码复制进去:
using UnityEngine;
public class EnemyController : MonoBehaviour
{
[SerializeField] private float moveSpeed = 2f;
private Rigidbody2D rb;
private bool movingRight = true;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
// 如果向右移动,速度为正;向左,速度为负。
rb.velocity = new Vector2(movingRight ? moveSpeed : -moveSpeed, rb.velocity.y);
}
// OnTriggerEnter2D 当一个物体的碰撞体进入另一个物体的触发器时调用。
// 我们将使用触发器来让敌人在到达边缘时转向。
private void OnTriggerEnter2D(Collider2D collision)
{
// 如果碰到地面,就转向。
if (collision.CompareTag("Ground"))
{
movingRight = !movingRight;
// 翻转精灵,使其朝向移动方向
transform.localScale = new Vector3(movingRight ? 1 : -1, 1, 1);
}
}
}
应用脚本并设置触发器
- 将
EnemyController脚本应用到Slime对象上。 - 选中
Slime对象,在Inspector中找到Box Collider 2D组件。 - 勾选
Is Trigger选项,这会使碰撞体变为“触发器”,它依然能检测碰撞,但不会产生物理阻挡效果,非常适合用于检测边缘。 - 设置标签:我们需要让敌人知道什么是“地面”。
- 选中
Ground对象。 - 在
Inspector顶部找到Tag下拉菜单,选择Add Tag...。 - 在
New Tag下方的User Layer 8(或其他空白行) 中输入Ground。 - 再次选中
Ground对象,在Tag下拉菜单中选择我们刚刚创建的Ground
- 选中
处理玩家与敌人的碰撞
我们需要当玩家碰到敌人时,游戏结束,这需要 OnCollisionEnter2D。
- 打开
PlayerController.cs脚本,添加以下代码:
using UnityEngine;
// ... (之前的代码保持不变) ...
public class PlayerController : MonoBehaviour
{
// ... (之前的变量声明保持不变) ...
// OnCollisionEnter2D 当两个物体的碰撞体发生物理碰撞时调用。
private void OnCollisionEnter2D(Collision2D collision)
{
// 如果碰撞到的对象是敌人
if (collision.gameObject.CompareTag("Enemy"))
{
Debug.Log("Game Over!");
// 在这里添加游戏结束的逻辑,比如显示一个UI面板或重新加载场景。
// 简单起见,我们先让游戏暂停。
Time.timeScale = 0f; // 暂停游戏
}
}
// ... (Start, Update, FixedUpdate, OnDrawGizmosSelected 保持不变) ...
}
- 设置敌人标签:选中
Slime对象,在Tag下拉菜单中选择Enemy。
测试敌人
运行游戏,现在你应该能看到一个史莱姆在地上来回移动,如果你碰到它,游戏会暂停,并在控制台打印 "Game Over!"。
第五部分:总结与进阶
恭喜!你已经完成了这个 2D 平台跳跃游戏的核心功能,你学会了:
- 如何设置 Unity 2D 项目。
- 如何使用精灵创建游戏对象。
- 如何使用
Rigidbody 2D和Collider 2D实现物理交互。 - 如何用 C# 编写脚本来控制角色和敌人。
- 如何使用
Update、FixedUpdate和碰撞/触发事件。
接下来可以做什么?(进阶方向)
- 添加动画:让你的角色和敌人动起来!使用 Unity 的 Animator 和 Animation 窗口,根据角色的状态(待机、跑动、跳跃)切换不同的精灵。
- 添加摄像机跟随:创建一个主摄像机,让它跟随玩家移动,而不是固定在场景中央。
- 收集物品:创建一个可收集的物品(比如金币),当玩家碰到它时,物品消失,并增加分数。
- 添加UI:使用 Unity 的 UI 系统创建一个分数显示面板和游戏结束界面。
- 创建关卡:学习使用 Tilemap 功能来快速创建复杂的关卡地形。
- 添加音效和背景音乐:使用
AudioSource组件为你的游戏添加声音,提升游戏体验。
这个教程为你打下了坚实的基础,你可以自由地发挥创意,将这个简单的游戏扩展成一个完整的作品!祝你开发愉快!
