12.1 2D 平台跳跃游戏


文档摘要

12.1 2D 平台跳跃游戏 12.1 2D 平台跳跃游戏:从零开始构建你的第一个横版世界 12.1.1 引言:跳跃的艺术与游戏的灵魂 平台跳跃游戏,又称横版过关游戏,是游戏史上最经典、也是最受欢迎的游戏类型之一。从早期的《超级马里奥兄弟》、《索尼克》到近年的《蔚蓝》、《死亡细胞》,平台跳跃游戏以其简单直接的操作、富有趣味的关卡设计以及挑战性十足的难度,吸引着无数玩家。 在本章节中,我们将以 Unity3D 引擎为基础,从零开始构建一个基础的 2D 平台跳跃游戏。我们将深入探讨角色控制、物理引擎、碰撞检测、动画系统以及简单的关卡设计,让你掌握开发 2D 平台跳跃游戏的核心技术和流程。 学习目标: 掌握 Unity3D 2D 项目的创建和基本设置。

12.1 2D 平台跳跃游戏

12.1 2D 平台跳跃游戏:从零开始构建你的第一个横版世界

12.1.1 引言:跳跃的艺术与游戏的灵魂

平台跳跃游戏,又称横版过关游戏,是游戏史上最经典、也是最受欢迎的游戏类型之一。从早期的《超级马里奥兄弟》、《索尼克》到近年的《蔚蓝》、《死亡细胞》,平台跳跃游戏以其简单直接的操作、富有趣味的关卡设计以及挑战性十足的难度,吸引着无数玩家。

在本章节中,我们将以 Unity3D 引擎为基础,从零开始构建一个基础的 2D 平台跳跃游戏。我们将深入探讨角色控制、物理引擎、碰撞检测、动画系统以及简单的关卡设计,让你掌握开发 2D 平台跳跃游戏的核心技术和流程。

学习目标:

  • 掌握 Unity3D 2D 项目的创建和基本设置。

  • 理解并实现 2D 角色控制,包括移动、跳跃、以及基本的角色状态管理。

  • 掌握 Unity 物理引擎在 2D 游戏中的应用,包括刚体、碰撞器和物理材质。

  • 学习如何处理 2D 碰撞检测,实现角色与环境的互动。

  • 掌握 Unity 动画系统,为角色添加生动的动画效果。

  • 了解简单的关卡设计原则,构建可玩的游戏关卡。

  • 熟悉常用的 C# 脚本编写技巧,提升游戏开发效率。

准备工作:

  • 安装 Unity3D 引擎 (建议 2021 或以上版本)。

  • 具备基础的 C# 编程知识。

  • 准备好 2D 角色和场景素材 (本教程提供基础素材,你也可以使用自己的素材)。

12.1.2 创建 Unity 2D 项目与场景搭建

首先,我们创建一个新的 Unity 2D 项目。

  1. 打开 Unity Hub,点击 “新建项目”。

  2. 在模板选择中,选择 “2D”。

  3. 输入项目名称(例如:Platformer2D),选择项目路径,点击 “创建项目”。

Unity 编辑器打开后,我们开始搭建游戏场景。

  1. 导入素材: 将提供的素材资源(角色、平台、背景等)拖拽到 “Project” 窗口的 “Assets” 文件夹中。如果没有素材,可以先使用 Unity 提供的默认 Sprite 或自行制作简单的图形。

  2. 创建地面平台:

    • 在 “Hierarchy” 窗口中,右键点击,选择 “2D Object” -> “Sprites” -> “Square”。

    • 将 Square Sprite 重命名为 “Ground”。

    • 在 “Inspector” 窗口中,调整 “Transform” 组件的 “Scale” 属性,例如 X = 10, Y = 1,使其成为一个长条形的地面平台。

    • 为 “Ground” 添加碰撞器组件:点击 “Add Component” 按钮,搜索 “Box Collider 2D” 并添加。这将使地面平台能够与角色发生碰撞。

    • 在 “Inspector” 窗口中,点击 “Add Component” 按钮,搜索 “Rigidbody 2D” 并添加。将 “Body Type” 设置为 “Static”。静态刚体不会受到物理力的影响,适合作为地面平台。

  3. 创建玩家角色:

    • 将角色 Sprite (例如名为 “Player”) 从 “Project” 窗口拖拽到 “Hierarchy” 窗口中。

    • 调整角色 Sprite 的 “Transform” 组件的 “Position” 属性,使其位于地面平台之上。

    • 为 “Player” 添加碰撞器组件:点击 “Add Component” 按钮,搜索 “Box Collider 2D” 并添加。

    • 为 “Player” 添加刚体组件:点击 “Add Component” 按钮,搜索 “Rigidbody 2D” 并添加。 刚体是物理模拟的基础,允许角色受到重力和其他力的影响。

  4. 调整摄像机:

    • 选中 “Hierarchy” 窗口中的 “Main Camera”。

    • 在 “Inspector” 窗口中,调整摄像机的 “Transform” -> “Position” 属性,使其能够完整地显示游戏场景。

    • 将 “Main Camera” 的 “Projection” 设置为 “Orthographic” (正交投影),更适合 2D 游戏。

  5. 保存场景: 点击 “File” -> “Save As”,将当前场景保存到 “Assets” 文件夹中,命名为 “MainScene”。

至此,我们完成了基本的场景搭建。一个简单的包含地面平台和玩家角色的 2D 场景已经创建完成。

12.1.3 角色移动控制:脚本编写与物理互动

接下来,我们编写 C# 脚本来实现角色的移动控制。

  1. 创建 PlayerController 脚本:

    • 在 “Project” 窗口的 “Assets” 文件夹中,右键点击,选择 “Create” -> “C# Script”。

    • 将脚本命名为 “PlayerController”。

  2. 编写脚本代码: 双击 “PlayerController.cs” 文件打开脚本编辑器,输入以下代码:

using UnityEngine; public class PlayerController : MonoBehaviour { public float moveSpeed = 5f; // 移动速度 public float jumpForce = 10f; // 跳跃力度 public Transform groundCheck; // 地面检测点 public float groundCheckRadius = 0.2f; // 地面检测半径 public LayerMask groundLayer; // 地面图层 private Rigidbody2D rb; // 刚体组件 private bool isGrounded; // 是否在地面上 void Start() { rb = GetComponent<Rigidbody2D>(); // 获取角色身上的 Rigidbody2D 组件 } void Update() { // 1. 地面检测 isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, groundLayer); // 2. 水平移动 float moveInput = Input.GetAxisRaw("Horizontal"); // 获取水平方向输入 (-1, 0, 1) rb.velocity = new Vector2(moveInput * moveSpeed, rb.velocity.y); // 3. 跳跃 if (isGrounded && Input.GetButtonDown("Jump")) // 当在地面上且按下跳跃键时 { rb.velocity = new Vector2(rb.velocity.x, jumpForce); // 给角色一个向上的速度 } } }
  1. 脚本组件绑定与参数设置:

    • 在 “Hierarchy” 窗口中选中 “Player” 对象。

    • 将 “PlayerController.cs” 脚本从 “Project” 窗口拖拽到 “Player” 对象的 “Inspector” 窗口中,添加为组件。

    • 在 “Inspector” 窗口中,设置 “PlayerController” 组件的参数:

      • Move Speed: 根据需要调整移动速度,例如 5f。

      • Jump Force: 根据需要调整跳跃力度,例如 10f。

      • Ground Check: 需要创建一个空物体作为地面检测点。

        • 在 “Hierarchy” 窗口中,右键点击 “Player”,选择 “2D Object” -> “Sprites” -> “Square”。

        • 将 Square Sprite 重命名为 “GroundCheck”。

        • 将 “GroundCheck” 拖拽为 “Player” 的子物体。

        • 调整 “GroundCheck” 的 “Transform” -> “Position” 属性,使其位于角色脚底略微下方。

        • 将 “GroundCheck” 对象拖拽到 “PlayerController” 组件的 “Ground Check” 属性槽中。

      • Ground Check Radius: 地面检测半径,例如 0.2f。

      • Ground Layer: 需要创建一个 “Ground” 图层,并将地面平台 “Ground” 对象设置为该图层。

        • 在 “Inspector” 窗口中选中 “Ground” 对象,点击 “Layer” 下拉菜单,选择 “Add Layer...”。

        • 在 “Tags & Layers” 设置窗口中,添加一个新的 Layer,命名为 “Ground”。

        • 再次选中 “Ground” 对象,将 “Layer” 设置为 “Ground”。

        • 在 “PlayerController” 组件的 “Ground Layer” 属性槽中,选择 “Ground” 图层。

  2. 运行测试: 点击 Unity 编辑器顶部的 “Play” 按钮运行游戏。使用键盘上的 “A” 和 “D” 或 “←” 和 “→” 键控制角色左右移动,使用 “Space” 键跳跃。

代码详解:

  • public float moveSpeed = 5f;, public float jumpForce = 10f;: 定义了公开的移动速度和跳跃力度变量,可以在 Inspector 窗口中调整。

  • public Transform groundCheck;, public float groundCheckRadius = 0.2f;, public LayerMask groundLayer;: 用于地面检测的变量。groundCheck 是地面检测点的 Transform 组件,groundCheckRadius 是检测半径,groundLayer 是地面所在的图层。

  • private Rigidbody2D rb;: 私有的 Rigidbody2D 组件变量,用于控制角色的物理运动。

  • private bool isGrounded;: 私有的布尔变量,用于记录角色是否在地面上。

  • void Start(): 在游戏开始时执行一次,用于获取角色身上的 Rigidbody2D 组件。

    • rb = GetComponent<Rigidbody2D>();: 获取当前游戏对象 (Player) 上的 Rigidbody2D 组件并赋值给 rb 变量。
  • void Update(): 每帧执行一次,用于处理游戏逻辑。

    • isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, groundLayer);: 地面检测。

      • Physics2D.OverlapCircle(): 在指定位置和半径范围内检测圆形区域内是否有碰撞器与指定的图层 (groundLayer) 发生重叠。

      • groundCheck.position: 地面检测点的位置。

      • groundCheckRadius: 检测半径。

      • groundLayer: 地面图层。

      • 返回值 true 表示检测到地面,false 表示没有检测到地面。

    • float moveInput = Input.GetAxisRaw("Horizontal");: 获取水平方向输入。

      • Input.GetAxisRaw("Horizontal"): 获取水平方向的输入值,返回值为 -1 (向左), 0 (没有输入), 1 (向右)。 通常对应键盘上的 “A/D” 或 “←/→” 键。
    • rb.velocity = new Vector2(moveInput * moveSpeed, rb.velocity.y);: 控制水平移动。

      • rb.velocity: 设置刚体的速度。

      • new Vector2(moveInput * moveSpeed, rb.velocity.y): 创建一个新的二维向量作为速度。

        • moveInput * moveSpeed: 水平方向速度,根据输入值和移动速度计算。

        • rb.velocity.y: 垂直方向速度保持不变,不受水平移动影响。

    • if (isGrounded && Input.GetButtonDown("Jump")): 跳跃条件判断。

      • isGrounded: 判断角色是否在地面上。

      • Input.GetButtonDown("Jump"): 判断是否按下跳跃键 (默认是 Space 键)。

    • rb.velocity = new Vector2(rb.velocity.x, jumpForce);: 跳跃实现。

      • new Vector2(rb.velocity.x, jumpForce): 创建一个新的二维向量作为速度。

        • rb.velocity.x: 水平方向速度保持不变。

        • jumpForce: 垂直方向速度设置为跳跃力度,实现向上跳跃。

12.1.4 摄像机跟随:保持角色始终在视野中心

为了让摄像机跟随角色移动,我们需要编写一个简单的摄像机跟随脚本。

  1. 创建 CameraFollow 脚本:

    • 在 “Project” 窗口的 “Assets” 文件夹中,右键点击,选择 “Create” -> “C# Script”。

    • 将脚本命名为 “CameraFollow”。

  2. 编写脚本代码: 双击 “CameraFollow.cs” 文件打开脚本编辑器,输入以下代码:

using UnityEngine; public class CameraFollow : MonoBehaviour { public Transform target; // 追踪目标 (Player) public float smoothSpeed = 0.125f; // 平滑移动速度 public Vector3 offset; // 偏移量 void LateUpdate() // 在所有 Update 函数执行之后执行,保证角色移动后再移动摄像机 { if (target != null) // 确保目标不为空 { Vector3 desiredPosition = target.position + offset; // 目标位置加上偏移量 Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed); // 平滑移动 transform.position = smoothedPosition; // 设置摄像机位置 } } }
  1. 脚本组件绑定与参数设置:

    • 在 “Hierarchy” 窗口中选中 “Main Camera” 对象。

    • 将 “CameraFollow.cs” 脚本从 “Project” 窗口拖拽到 “Main Camera” 对象的 “Inspector” 窗口中,添加为组件。

    • 在 “Inspector” 窗口中,设置 “CameraFollow” 组件的参数:

      • Target: 将 “Hierarchy” 窗口中的 “Player” 对象拖拽到 “CameraFollow” 组件的 “Target” 属性槽中。

      • Smooth Speed: 调整平滑移动速度,例如 0.125f。 值越小,平滑效果越明显,但摄像机跟随可能会略有延迟。

      • Offset: 调整偏移量,控制摄像机相对于角色的位置。 例如,可以设置 Y 轴偏移量,使角色略微偏离屏幕中心下方。

  2. 运行测试: 再次点击 Unity 编辑器顶部的 “Play” 按钮运行游戏。观察摄像机是否平滑地跟随角色移动。

代码详解:

  • public Transform target;: 公开的 Transform 组件变量,用于指定摄像机追踪的目标对象 (Player)。

  • public float smoothSpeed = 0.125f;: 公开的平滑移动速度变量,控制摄像机跟随的平滑程度。

  • public Vector3 offset;: 公开的 Vector3 变量,用于设置摄像机相对于目标的偏移量。

  • void LateUpdate(): 在所有 Update 函数执行之后执行。 适用于摄像机跟随等需要在所有对象移动之后再进行处理的逻辑。

    • if (target != null): 确保目标对象不为空,避免空引用错误。

    • Vector3 desiredPosition = target.position + offset;: 计算摄像机期望到达的位置。

      • target.position: 获取目标对象 (Player) 的位置。

      • offset: 加上预设的偏移量。

    • Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);: 平滑移动计算。

      • Vector3.Lerp(transform.position, desiredPosition, smoothSpeed): 线性插值函数,在当前位置 (transform.position) 和目标位置 (desiredPosition) 之间进行插值,插值比例由 smoothSpeed 控制。 smoothSpeed 越接近 1,移动越快越直接;越接近 0,移动越慢越平滑。
    • transform.position = smoothedPosition;: 设置摄像机的位置为平滑移动后的位置。

12.1.5 动画系统:为角色添加生动表现

为角色添加动画,可以使其更加生动有趣。我们将为角色添加基本的 Idle (待机) 和 Run (奔跑) 动画。

  1. 准备动画素材: 你需要准备角色的 Idle 和 Run 动画帧序列图片。 如果没有素材,可以使用 Unity Asset Store 中的免费 2D 动画素材,或者使用如 Piskel 等像素画工具自行制作简单的动画。

  2. 创建动画控制器 (Animator Controller):

    • 在 “Project” 窗口的 “Assets” 文件夹中,右键点击,选择 “Create” -> “Animator Controller”。

    • 将 Animator Controller 命名为 “PlayerAnimatorController”。

  3. 打开动画窗口 (Animator Window):

    • 双击 “PlayerAnimatorController.controller” 文件,或者在 Unity 编辑器顶部菜单栏选择 “Window” -> “Animation” -> “Animator”。
  4. 创建动画状态 (Animation States):

    • 在 Animator 窗口中,右键点击空白区域,选择 “Create State” -> “Empty”。 将新状态重命名为 “Idle”。

    • 再次右键点击空白区域,选择 “Create State” -> “Empty”。 将新状态重命名为 “Run”。

  5. 创建动画片段 (Animation Clips):

    • 在 “Project” 窗口中,选中 Idle 动画帧序列图片。

    • 将这些图片拖拽到 Animator 窗口中 “Idle” 状态的方框内,Unity 会自动创建一个名为 “Idle” 的 Animation Clip。

    • 同样的方式,将 Run 动画帧序列图片拖拽到 “Run” 状态的方框内,创建 “Run” Animation Clip。

  6. 创建动画参数 (Animator Parameters):

    • 在 Animator 窗口的左侧 “Parameters” 面板中,点击 “+” 按钮,选择 “Bool” 类型,创建一个名为 “IsRunning” 的布尔参数。
  7. 创建动画状态转移 (Transitions):

    • 在 Animator 窗口中,右键点击 “Idle” 状态,选择 “Make Transition”。 将箭头拖拽到 “Run” 状态,创建从 “Idle” 到 “Run” 的转移。

    • 同样的方式,创建从 “Run” 到 “Idle” 的转移。

  8. 设置动画状态转移条件 (Transition Conditions):

    • 选中从 “Idle” 到 “Run” 的转移箭头。 在 “Inspector” 窗口中,展开 “Conditions” 区域,点击 “+” 按钮,选择 “IsRunning”,并将条件设置为 “true”。 表示当 “IsRunning” 参数为 true 时,从 Idle 状态转移到 Run 状态。

    • 选中从 “Run” 到 “Idle” 的转移箭头。 在 “Inspector” 窗口中,展开 “Conditions” 区域,点击 “+” 按钮,选择 “IsRunning”,并将条件设置为 “false”。 表示当 “IsRunning” 参数为 false 时,从 Run 状态转移到 Idle 状态。

  9. 绑定 Animator Controller 到角色:

    • 在 “Hierarchy” 窗口中选中 “Player” 对象。

    • 在 “Inspector” 窗口中,点击 “Add Component” 按钮,搜索 “Animator” 并添加。

    • 将 “PlayerAnimatorController.controller” 文件从 “Project” 窗口拖拽到 “Animator” 组件的 “Controller” 属性槽中。

  10. 在 PlayerController 脚本中控制动画:

    • 打开 “PlayerController.cs” 脚本,添加以下代码:
private Animator animator; // 动画器组件 void Start() { rb = GetComponent<Rigidbody2D>(); animator = GetComponent<Animator>(); // 获取角色身上的 Animator 组件 } void Update() { // ... (之前的移动和跳跃代码) ... // 4. 动画控制 animator.SetBool("IsRunning", Mathf.Abs(moveInput) > 0.1f); // 根据水平输入设置 IsRunning 参数 }
  1. 运行测试: 再次点击 Unity 编辑器顶部的 “Play” 按钮运行游戏。观察角色是否根据移动状态切换 Idle 和 Run 动画。

代码详解 (动画部分):

  • private Animator animator;: 私有的 Animator 组件变量,用于控制角色的动画。

  • animator = GetComponent<Animator>();: 在 Start() 函数中获取角色身上的 Animator 组件。

  • animator.SetBool("IsRunning", Mathf.Abs(moveInput) > 0.1f);: 在 Update() 函数中控制动画。

    • animator.SetBool("IsRunning", ...): 设置 Animator Controller 中名为 “IsRunning” 的布尔参数的值。

    • Mathf.Abs(moveInput) > 0.1f: 判断水平输入的绝对值是否大于 0.1f。 当水平输入有值 (左右移动) 时,条件为 true,否则为 false。 用于判断角色是否在移动。

12.1.6 简单的关卡设计:构建可玩的游戏区域

关卡设计是平台跳跃游戏的核心。 简单的关卡设计包括平台放置、障碍物设置等。

  1. 添加更多平台: 在 “Hierarchy” 窗口中复制已有的 “Ground” 平台 (Ctrl + D 或 Cmd + D),并调整其 “Transform” -> “Position” 属性,创建更多的平台,形成简单的跳跃路线。

  2. 调整平台大小: 根据需要调整平台的 “Transform” -> “Scale” 属性,改变平台的大小和形状。

  3. 添加移动平台 (可选): 可以创建移动平台,增加关卡的趣味性和挑战性。

    • 创建一个新的 Square Sprite,命名为 “MovingPlatform”。

    • 添加 Box Collider 2D 和 Rigidbody 2D 组件。 将 Rigidbody 2D 的 “Body Type” 设置为 “Kinematic” (运动学),使其不受物理力影响,但可以通过代码控制移动。

    • 编写脚本控制平台的移动,例如简单的左右或上下移动。

  4. 添加障碍物 (可选): 例如,可以添加尖刺、敌人等障碍物,增加游戏的难度。

  5. 测试关卡: 不断运行游戏,测试关卡的流畅性和难度,并进行调整和优化。

关卡设计原则 (基础):

  • 循序渐进: 关卡难度应该循序渐进,逐步增加挑战。

  • 引导明确: 关卡设计应该引导玩家前进,避免玩家迷路。

  • 节奏控制: 关卡应该有节奏感,交替出现挑战和休息区域。

  • 视觉吸引力: 关卡设计应该具有一定的视觉吸引力,让玩家感到愉悦。

12.1.7 总结与展望

恭喜你! 你已经完成了第一个 2D 平台跳跃游戏的基础框架。 在本章节中,我们学习了:

  • Unity 2D 项目的创建和场景搭建。

  • 角色移动控制脚本的编写,包括移动、跳跃和地面检测。

  • 摄像机跟随脚本的编写,保持角色在视野中心。

  • 角色动画系统的实现,添加 Idle 和 Run 动画。

  • 简单的关卡设计原则。

下一步学习方向:

  • 更完善的角色控制: 例如,添加二段跳、冲刺、墙壁跳跃等更高级的移动技巧。

  • 更丰富的动画效果: 例如,添加跳跃、落地、受伤等更多动画状态。

  • 碰撞检测与游戏逻辑: 例如,实现角色与敌人、道具的碰撞检测,添加生命值、得分、道具收集等游戏逻辑。

  • 更复杂的关卡设计: 例如,设计包含机关、谜题、敌人、Boss 战等更丰富的关卡元素。

  • UI 界面: 例如,添加游戏开始界面、暂停界面、得分显示、生命值显示等 UI 界面。

  • 音效和音乐: 为游戏添加音效和背景音乐,提升游戏体验。

平台跳跃游戏的开发是一个不断迭代和完善的过程。 通过不断学习和实践,你可以构建出更加丰富、有趣、更具挑战性的 2D 平台跳跃游戏。 希望本章节能够帮助你迈出游戏开发的第一步,开启你的游戏创作之旅!


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U