杰瑞科技汇

Unity3D如何做2D游戏?入门教程怎么学?

Unity 2D 完整入门教程:从零开始制作一个平台跳跃游戏

本教程将带你了解 Unity 2D 开发的核心概念,包括:

Unity3D如何做2D游戏?入门教程怎么学?-图1
(图片来源网络,侵删)
  • 场景与项目管理
  • 精灵与动画
  • 物理系统
  • C# 脚本编程
  • 碰撞检测与响应
  • 预制件

第一部分:准备工作与项目设置

安装 Unity

如果你还没有安装 Unity,请访问 Unity 官网 下载并安装 Unity Hub,然后通过 Hub 安装最新的 LTS (长期支持) 版本,2025.3.x 或 2025.3.x,LTS 版本更稳定,适合开发项目。

创建新项目

  1. 打开 Unity Hub。
  2. 点击 “新建项目” (New Project)
  3. 选择 2D (Core) 模板,这个模板会自动为你配置好 2D 项目所需的一切,2D 渲染管线和物理设置。
  4. 为你的项目命名(2DPlatformer),选择一个位置保存,然后点击 “创建项目” (Create project)

熟悉 Unity 界面

创建项目后,你会看到几个主要的窗口:

  • Scene (场景视图):你用来摆放和编辑游戏对象的地方,像一张设计图。
  • Game (游戏视图):玩家最终看到的游戏画面,是场景的实时预览。
  • Hierarchy (层级视图):显示当前场景中所有游戏对象的列表,像一个家族树。
  • Project (项目视图):显示你的项目所有文件,如脚本、图片、音频等。
  • Inspector (检查器视图):显示在 Hierarchy 中选中对象的详细属性和组件。

第二部分:创建游戏场景与角色

准备资源

我们需要一些图片(精灵)来制作我们的游戏,你可以自己绘制,也可以在网上寻找免费的 2D 游戏素材,推荐网站:

为了方便,我们将使用 Unity 自带的一些资源,它们位于 Project 窗口 -> Packages -> 2D Pixel Pack -> Sprites 目录下。

Unity3D如何做2D游戏?入门教程怎么学?-图2
(图片来源网络,侵删)

创建地面

  1. Project 窗口中,找到 Packages -> 2D Pixel Pack -> Sprites -> Backgrounds -> Tilemaps -> Colored
  2. 找到 Ground 精灵,按住鼠标左键拖拽Scene 视图中。
  3. Inspector 窗口中,调整 Transform 组件下的 Position (X: 0, Y: -3, Z: 0) 和 Scale (X: 10, Y: 1, Z: 1),让它看起来像一条长长的地面。

创建玩家

  1. 同样在 Project 窗口中,找到 Packages -> 2D Pixel Pack -> Sprites -> Characters -> Player
  2. 找到 Player 精灵,拖拽Scene 视图中,放在地面上方。
  3. 调整玩家的 Position (X: 0, Y: 0, Z: 0)。

添加物理组件 (关键步骤)

为了让我们的角色能够受重力影响并与地面发生碰撞,我们需要给它添加物理组件。

  1. Scene 视图中选中 Player 对象。
  2. Inspector 窗口中,点击 “添加组件” (Add Component)
  3. 添加 Rigidbody 2D 组件,这个组件会让物体拥有质量、速度,并受到物理引擎的影响。
  4. 再次点击 “添加组件”,添加 Collider 2D -> Box Collider 2D 组件,这个组件定义了物体的碰撞边界,物理引擎会用它来检测碰撞。

重要提示Rigidbody 2DCollider 2D 是 2D 物理的核心。玩家、敌人等需要移动的物体,需要 Rigidbody 2D,而 地面、墙壁等静态障碍物,只需要 Collider 2D 即可

为地面添加碰撞体

  1. 选中我们之前创建的 Ground 对象。
  2. 为它添加 Box Collider 2D 组件,因为地面是静止的,所以不需要 Rigidbody 2D

运行游戏(点击顶部工具栏的播放按钮),你会发现玩家会因为重力掉到地面上,并停在那里,这很好!


第三部分:编写玩家控制脚本

现在让我们让玩家动起来。

Unity3D如何做2D游戏?入门教程怎么学?-图3
(图片来源网络,侵删)

创建 C# 脚本

  1. Project 窗口中,右键点击一个空白处,选择 Create -> C# Script
  2. 将脚本命名为 PlayerController
  3. 双击 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);
        }
    }
}

应用脚本并设置地面检测

  1. 回到 Unity,选中 Player 对象。
  2. Project 窗口中的 PlayerController 脚本拖拽Player 对象的 Inspector 窗口中。
  3. 你会看到脚本组件出现在 Inspector 中,moveSpeedjumpForce 的值可以调整。
  4. 我们需要一个“地面检测点”,在 Hierarchy 中右键 Player,选择 Create Empty,这会创建一个空的子对象。
  5. 将这个新对象重命名为 GroundCheck
  6. 选中 GroundCheck,在 Inspector 中调整其 Position(X: 0, Y: -0.5, Z: 0),让它位于玩家脚下的位置。
  7. 回到 Player 对象,你会发现 PlayerController 组件出现了 Ground Check 的字段,将 GroundCheck 对象拖拽到这个字段里。
  8. 设置层级:我们需要告诉脚本哪些图层是地面。
    • Hierarchy 中选中 Ground 对象。
    • Inspector 窗口的顶部,找到 Layer 下拉菜单,选择 Add Layer...
    • User Layer 8 (或其他空白行) 中输入 Ground
    • 再次选中 Ground 对象,在 Layer 下拉菜单中选择我们刚刚创建的 Ground 层。
    • 回到 Player 对象,在 PlayerController 组件中,将 Ground Layer 字段设置为 Ground

测试控制

运行游戏!你应该可以使用 A/D左/右方向键 来左右移动,使用 空格键 来跳跃了!


第四部分:添加敌人与碰撞检测

一个没有敌人的游戏是无聊的,我们来添加一个简单的敌人。

创建敌人

  1. Project 窗口中,找到 Packages -> 2D Pixel Pack -> Sprites -> Enemies -> Slime
  2. Slime 精灵拖拽到 Scene 视图中,放在地面上。
  3. Slime 添加 Rigidbody 2DBox Collider 2D 组件。

创建敌人移动脚本

  1. 创建一个新的 C# 脚本,命名为 EnemyController
  2. 将以下代码复制进去:
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);
        }
    }
}

应用脚本并设置触发器

  1. EnemyController 脚本应用到 Slime 对象上。
  2. 选中 Slime 对象,在 Inspector 中找到 Box Collider 2D 组件。
  3. 勾选 Is Trigger 选项,这会使碰撞体变为“触发器”,它依然能检测碰撞,但不会产生物理阻挡效果,非常适合用于检测边缘。
  4. 设置标签:我们需要让敌人知道什么是“地面”。
    • 选中 Ground 对象。
    • Inspector 顶部找到 Tag 下拉菜单,选择 Add Tag...
    • New Tag 下方的 User Layer 8 (或其他空白行) 中输入 Ground
    • 再次选中 Ground 对象,在 Tag 下拉菜单中选择我们刚刚创建的 Ground

处理玩家与敌人的碰撞

我们需要当玩家碰到敌人时,游戏结束,这需要 OnCollisionEnter2D

  1. 打开 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 保持不变) ...
}
  1. 设置敌人标签:选中 Slime 对象,在 Tag 下拉菜单中选择 Enemy

测试敌人

运行游戏,现在你应该能看到一个史莱姆在地上来回移动,如果你碰到它,游戏会暂停,并在控制台打印 "Game Over!"。


第五部分:总结与进阶

恭喜!你已经完成了这个 2D 平台跳跃游戏的核心功能,你学会了:

  • 如何设置 Unity 2D 项目。
  • 如何使用精灵创建游戏对象。
  • 如何使用 Rigidbody 2DCollider 2D 实现物理交互。
  • 如何用 C# 编写脚本来控制角色和敌人。
  • 如何使用 UpdateFixedUpdate 和碰撞/触发事件。

接下来可以做什么?(进阶方向)

  1. 添加动画:让你的角色和敌人动起来!使用 Unity 的 AnimatorAnimation 窗口,根据角色的状态(待机、跑动、跳跃)切换不同的精灵。
  2. 添加摄像机跟随:创建一个主摄像机,让它跟随玩家移动,而不是固定在场景中央。
  3. 收集物品:创建一个可收集的物品(比如金币),当玩家碰到它时,物品消失,并增加分数。
  4. 添加UI:使用 Unity 的 UI 系统创建一个分数显示面板和游戏结束界面。
  5. 创建关卡:学习使用 Tilemap 功能来快速创建复杂的关卡地形。
  6. 添加音效和背景音乐:使用 AudioSource 组件为你的游戏添加声音,提升游戏体验。

这个教程为你打下了坚实的基础,你可以自由地发挥创意,将这个简单的游戏扩展成一个完整的作品!祝你开发愉快!

分享:
扫描分享到社交APP
上一篇
下一篇