【Unity小游戏】游戏开发案例-Unity打造畅玩无阻的小游戏(上)

击球方阵

乒乓克隆

  • 使用立方体建造竞技场、球拍和球。
  • 移动球和球拍。
  • 击球并得分。
  • 让相机感受到冲击力。
  • 给游戏一个抽象的霓虹灯外观。

这是有关基础游戏的系列教程中的第一个教程。在其中,我们将创建一个简单的 Pong 克隆。

本教程是使用 Unity 2021.3.16f1 制作的。

在方形竞技场中用球拍击打方球

本系列将涵盖简单游戏基础游戏的创建,以展示如何在短时间内将想法转变为最小的工作游戏。这些游戏将是克隆的,所以我们不必从头开始发明一个新想法,但我们会以某种方式偏离标准。

除了保持简单之外,我们还将为这个系列设置一个设计约束来限制自己:我们只能渲染默认的立方体和世界空间文本,仅此而已。另外,我不包括声音。

本系列假定您至少已经完成了基础知识系列,以及您选择的更多系列,以便您熟悉 Unity 中的工作和编程。我不会像其他系列那样详细地展示每个步骤,假设您可以自己创建游戏对象并在检查器中连接内容而无需屏幕截图。我也不会解释基本的数学或运动定律。

游戏场景

我们将在本教程中克隆的游戏是 Pong,这是乒乓球或网球的非常抽象的表示形式。你可以克隆 Pong 的想法,但不要给它一个类似的名字,以免会要求你把它拿下来。所以我们把我们的游戏命名为击球方阵,因为它都是正方形。

我们将从新 3D 项目的默认示例场景开始,尽管重命名为 .我们将使用的唯一包是您选择的编辑器集成包(在我的例子中)及其依赖项。这些包的依赖项是 Burst, Core RP Library, Custom NUnit, Mathematics, Seacher, Shader Graph, Test Framework 和 Unity UI。

创建渲染/URP 资源(使用通用渲染器)资源,并将其用于项目设置中的图形/可编程渲染管线设置和质量/渲染管线资源。

竞技场

创建默认多维数据集并将其转换为预制件。移除它的对撞机,因为我们不会依赖物理系统。使用其中四个在一个维度上缩放到 20 个单位,以形成 XZ 平面上原点周围 20×20 个正方形区域的边界。由于立方体的厚度为一个单位,因此每个立方体在适当的方向上从原点移动 10.5 个单位。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f0XUScMH-1682677243478)(null)]

为了使它更有趣一些,请再添加四个放大到大小 2 的预制件实例,并使用它们来填充边界角。将其 Y 坐标设置为 0.5,以便所有底部对齐。同时调整主摄像头,使其显示整个竞技场的自上而下视图。
请添加图片描述

竞技场需要有两个桨(板)。创建另一个默认多维数据集并将其转换为新的预制件,同样没有碰撞体。将其比例设置为 (8, 1.1, 1.1) 并为其提供白色材质。将它的两个实例添加到场景中,以便它们与底部和顶部边界的中间重叠,如上所示。
请添加图片描述

我们最不需要的是一个球,它也将是一个立方体。为此创建另一个立方体预制件(以防您以后决定添加多个球),并为其提供黄色材质。将它的实例放在场景的中心。

请添加图片描述

组件

虽然我们的游戏非常简单,可以用一个脚本控制一切,但我们会在逻辑上拆分功能,以使代码更易于理解。我们现在将创建明显的组件类型,稍后再填充它们。

首先,我们有一个移动的球,因此创建一个扩展类并将其作为组件添加到球预制件中。**Ball**``MonoBehaviour

using UnityEngine;

public class Ball : MonoBehaviour {}

其次,我们有会尝试击球的球拍,因此请为它们创建一个组件类型并将其添加到球拍预制件中。**Paddle**

using UnityEngine;

public class Paddle : MonoBehaviour {}

第三,我们需要一个控制游戏循环并与球和球拍通信的组件。只需命名它,给它配置字段以连接球和两个球拍,将其附加到场景中的空游戏对象,然后连接起来。**Game**

using UnityEngine;

public class Game : MonoBehaviour
{
[SerializeField]
Ball ball;

[SerializeField]
Paddle bottomPaddle, topPaddle;
}

控制球

比赛的重点在于控制球。球在竞技场上直线移动,直到击中某物。每个球员都试图定位其球拍,使其击中球并将其弹回另一侧。

位置和速度

为了移动,需要跟踪它的位置和速度。由于这实际上是一个 2D 游戏,我们将为此使用字段,其中 2D Y 维度表示 3D Z 维度。我们从恒定的 X 和 Y 速度开始,可通过单独的可序列化浮点字段进行配置。我使用 8 和 10 作为默认值。**Ball**``Vector2

public class Ball : MonoBehaviour
{
[SerializeField, Min(0f)]
float
constantXSpeed = 8f,
constantYSpeed = 10f;

Vector2 position, velocity;
}

我们最终可能会在每次更新时对球的位置和速度进行各种调整,所以我们不要一直设置它。相反,请为此创建一个公共方法。Transform.localPosition``UpdateVisualization

public void UpdateVisualization () =>
transform.localPosition = new Vector3(position.x, 0f, position.y);

我们不会让球不会自行移动,而是通过公共方法让它执行标准运动。Move

public void Move () => position += velocity * Time.deltaTime;

我们还为它提供了一个公共方法,为新游戏做好准备。球从竞技场的中心开始,更新其可视化效果以匹配,并使用配置的速度

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值