0%

Ruby's Adventure 2D Beginner

Ruby’s Adventure: 2D Beginner

前言

官方的一个非常好的2D教程,涉及:

使用 2D 资源

2D RPG 游戏制作流程

创建并控制角色(使用脚本代码)

使用瓦片地图创建世界

设置动态精灵,角色动画

一些简单特效(粒子效果),UI系统和2D声音系统

官方地址:https://learn.unity.com/project/ruby-s-2d-rpg?uv=2020.3

Assert store:https://assetstore.unity.com/packages/templates/tutorials/unity-learn-2d-beginner-complete-project-urp-140253

创建并控制角色

png图像跟着教程往unity拖,unity会自动转格式

移动角色

Unity 中,通过游戏对象的 Transform 组件,可以获取该对象在场景中的位置 Position,并通过更改 Transform 组件 Position 的值,可以更改其位置。

移动脚本

在 Update 方法中,更改 Ruby 角色位置

Unity 在每帧执行 Update 内的代码,为了形成动感,游戏(就像电影一样)是高速显示的静止图像。在游戏中通常会在一秒内显示 30 或 60 张图像。其中的一张图像称为一帧。

在此 Update 函数中,你可以编写想要在游戏中连续发生的任何操作(例如,读取玩家的输入、移动游戏对象或计算经过的时间)。

Vector2 二维向量

在脚本中,Vector 向量/矢量指的是带方向的线段

在 Unity 中,Transform 值使用 x 表示水平位置,使用 y 表示垂直位置,使用 z 表示深度。这 3 个数值组成一个坐标。由于此游戏是 2D 游戏,你无需存储 z 轴位置,因此你可以在此处使用 Vector2 来仅存储 x 和 y 位置。

Transform 中 position 的类型,也是 Vector2

控制角色

控制方式:电脑或主机的输入设备

在 Unity 项目设置中,可以通过 Input Manager 进行默认的游戏输入控制设置 Edit > Project Settings > Input

使用Input类来读取传统游戏输入中设置的轴/鼠标/按键,以及访问移动设备上的多点触控/加速度计数据。若要使用输入来进行任何类型的移动行为,请使用 Input.GetAxis。 它为您提供平滑且可配置的输入 - 可以映射到键盘、游戏杆或鼠标。 请将 Input.GetButton 仅用于事件等操作。不要将它用于移动操作。Input.GetAxis 将使脚本代码更简洁。

时间和帧率

当前的代码中,帧数越高,同一时间内,执行 Update 的次数越多,角色移动速度越快。

如果游戏以每秒 60 帧的速度运行,那么 Ruby 将移动 0.1 _ 60,因此每秒移动 6 个单位。但是,如果游戏以每秒 10 帧的速度运行,就像刚刚让游戏运行的那样,那么 Ruby 仅移动 0.1 _ 10,因此每秒移动 1 个单位!

如果一个玩家的计算机非常陈旧,只能以每秒 30 帧的速度运行游戏,而另一个玩家的计算机能以每秒 120 帧的速度运行游戏,那么这两个玩家的主角的移动速度会有很大差异。这样就会使游戏的难易程度提高或降低,具体取决于运行游戏的计算机。

而帧数是由硬件水平影响的(越好越高),不同电脑中,会导致游戏效果完全不同

可以锁帧,但硬件能达到的情况下(显卡、显示器),锁帧会降低画面效果。

要解决此问题,你需要以单位/秒来表示 Ruby 的移动速度,而不是采用单位/帧(目前采用此设置)。

为此,你需要通过将移动速度乘以 Unity 渲染一帧所需的时间来更改移动速度。如果游戏以每秒 10 帧的速度运行,则每帧耗时 0.1 秒。如果游戏以每秒 60 帧的速度运行,则每帧耗时 0.017 秒。如果将移动速度乘以该时间值,则移动速度将以秒表示。

Time.deltaTime 每帧的时间间隔,float 类型

一般将这个值,用在 Update 方法中,乘以移动的距离(或角度),用来获取恒定(不同硬件水平的电脑间)的速度

Tilemap 瓦片地图系统

Tilemap 是 2D 游戏中,用来构建世界的工具,这个工具使用技术的好坏,直接影响到你制作 2D 游戏时的工作量

瓦片地图组件,是一个存储和操作 Tile 资源的系统,用来创建 2D 关卡。

该系统还可以将所需信息通过所包含的 Tiles 传输到其他相关组件,例如 Tilemap Renderer 和 Tilemap Collider 2D。

创建瓦片地图时,Grid 组件自动作为瓦片地图的父级,并在将瓦片布置到瓦片地图上时作为参照

组件

素材相关:

  • Sprite(精灵):纹理的容器。大型纹理图集可以转换为精灵图集(Sprite Sheet)
  • Tile(瓦片):包含一个精灵,以及二个属性,颜色和碰撞体类型。使用瓦片就像在画布上画画一样,画画时可以设置一些颜色和属性

工具相关:

  • Tile Palette(瓦片调色板):当你在画布(Canvas)上画画时,会需要一个位置来保存绘画的结果。类似地,调色板(Palette)的功能就是保存瓦片,将它们绘制到网格上
  • Brush(笔刷):用于将画好的东西绘制到画布上。使用 Tilemap 时,可以在多个笔刷中任意选择,绘制出线条、方块等各种形状

组件相关:

  • Tilemap(瓦片地图):类似 Photoshop 中的图层,我们可以在 Tilemap 上画上 Tile
  • Grid(网格):用于控制网格属性的组件。Tilemap 是 Grid 的子对象。Grid 类似于 UI Canvas(UI 画布)。
  • Tilemap Renderer(瓦片地图渲染器):是 Tilemap 游戏对象的一部分,用于控制 Tile 在 Tilemap 上的渲染,控制诸如排序、材质和遮罩等。

分类

  • Rectangler 矩形瓦片地图
  • Hexagonal 六边形瓦片地图:除常规瓦片地图外,Unity 还提供 Hexagonal Point Top Tilemap 和 Hexagonal Flat Top Tilemap 瓦片地图。六角形瓦片通常用于战略类桌面游戏,因为它们的中心与边上的任何点之间具有一致的距离,并且相邻的瓦片总是共享边。因此,这些瓦片非常适合构建几乎任何类型的大型游戏区域,并让玩家做出关于移动和定位的战术决策。

瓦片和使用流程

瓦片是排列在瓦片地图上的资源,用于构建 2D 环境。每个瓦片引用一个选定的精灵,然后在瓦片地图网格上的瓦片位置处渲染该精灵。

  1. 预处理 sprite 资源:将图片资源拖拽到 project 中,生成 sprite;然后一般需要进行切割 slice ,将其配置成需要的各个 tile;
  2. 创建要在其上绘制瓦片的瓦片地图。此过程中还会自动创建 Grid 游戏对象作为瓦片地图的父级。
  3. 直接创建瓦片资源,或者通过将用作瓦片素材的精灵带入 Tile Palette 窗口自动生成瓦片。
  4. 创建一个包含瓦片资源的 Tile Palette,并使用各种笔刷来绘制到瓦片地图上。
  5. 可以将 Tilemap Collider 2D 组件连接到瓦片地图以便使瓦片地图与 Physics2D 交互。

一般 Tilemap 创建三个,分别为:

  • background(地图背景)
  • bound(边界)
  • foreground(前景,主要是地形)

场景排序

透视图指的是有深度、距离感的图,一般要三维中的深度轴来表现场景的深度,而二维游戏中没有这个深度,只能通过前后来仿造深度效果,称为“伪透视图”

先前通过调整瓦片的 Order in Layer 属性来解决了瓦片地图的排序问题,但并非总是希望一个游戏对象在另一个游戏对象之上,比如,在同一个瓦片地图中,玩家角色在一个物体之前(比如一棵树)时,应该是玩家遮挡树,而玩家移动到树后时,应该是树遮挡玩家,这就需要“伪造”透视图。

在 2D 游戏中,场景里的 “前后” 是由 Y 轴决定的,需要让 Unity 根据游戏对象的 y 坐标来绘制游戏对象

Y 轴 y 坐标值越小,越靠前,应该遮挡 y 坐标值较大的游戏对象,也就是 y 坐标较小的游戏对象后绘制,就会位于上层

每个 Sprite 都有一个轴心(中心点),Unity 根据 pivot 对 sprite 进行定位,这个 pivot 可以在 sprite editor 中调整,可以将其设置到 sprite 上任意位置

在 2D Rpg 游戏场景中的游戏对象,如果想要实现较为真实的 “伪透视” 效果,最好将游戏对象的 sprite 中 pivot 都设置到素材的最下方正中。

动画

动画剪辑(Animation clip)是动画的基本组成部分,包含某些对象应如何随时间改变其位置、旋转或其他属性的相关信息。

动画剪辑一般和不同的状态相挂接,比如“静止状态”挂接站立不移动时的动画、“奔跑状态”挂接跑动的动画剪辑….

Animator Controller 用来控制不同状态下动画的播放,以及状态间的转换

所有这些部分(动画剪辑、Animator Controller 和 Avatar)都通过 Animator 组件一起附加到某个游戏对象上。

Animator 分为两个部分,左侧是 Layers 和 Parameters,右侧是动画状态机 (Animation State Machine):

  • 第 1 部分:Layers 和 Parameters
    Layers 可用于 3D 动画,因为你可以将动画用于角色的不同部分。
    Parameters 由我们的脚本用来向 Controller 提供信息。
  • 第 2 部分:动画状态机
    动画状态机以图形方式显示动画的所有状态以及如何从一段动画过渡到另一段动画。

混合树 (Blend Tree),这种混合树允许你根据参数来混合多段动画。

Animator 是动画组件,可以理解为一个用来处理动画的功能型容器,所有和动画相关的部分(动画剪辑、Animator Controller 和 Avatar)都通过 Animator 组件一起附加到某个游戏对象上。

UI界面

Unity 用户界面 (Unity UI) 软件包(也称为 uGUI)是一个较旧的、基于游戏对象的 UI 系统,您可以使用它为游戏和应用程序开发运行时 UI。在 Unity UI 中,即可使用组件和 Game 视图来排列和定位用户界面并设置其样式。它支持高级渲染和文本功能。

使用步骤

  1. 创建 画布 Canves
  2. 在 画布 Canves 中添加 UI 组件(文本、文本框、按钮等等)
  3. 设置好布局、动画,以及摄像机、特效等
  4. 需要的话,再添加交互事件

UGUI 基础

Rect Transform 矩形变换

矩形变换像常规变换一样具有位置,旋转和比例,但它还具有宽度和高度表示矩形的尺寸。

Pivot 枢轴(轴心)

旋转、大小和缩放修改都是围绕轴心进行的,因此轴心的位置会影响旋转、大小调整或缩放的结果。

Anchors 锚点

锚点在场景视图中显示为四个小三角形手柄(四叶花)。每个叶子位置对应矩形的四个顶点。当描点随父对象变换时,矩形的顶点与对应的锚点相对位置必须保持不变。

例如,子项可以锚定到父项的中心,或锚定到一个角。

通过锚定还可以让子项随父项的宽度或高度一起拉伸。矩形的每个角与其对应的锚点都有一个固定的偏移,即矩形的左上角与左上角锚点有一个固定的偏移,以此类推。因此,矩形的不同角可以锚定到父矩形中的不同点。

遮罩

两个图像,一个是原图像,一个是遮罩图像,显示的是原图像,遮罩图像控制原图像的显示范围,只显示背遮罩区域的原图像。

所以可以通过更改遮罩图像的大小,来不失真地显示原图像的部分区域

静态成员

可以使用 static 关键字把类成员定义为静态的。当我们声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个该静态成员,并且被所有类对象所共享。

音频

为了模拟位置的影响,Unity 要求声音源来自附加到对象的 音频源 Audio Source。然后,发出的声音由附加到另一个对象(通常是主摄像机)上的 音频监听器 Audio Listener 拾取。Unity 然后可以模拟音频源与监听器物体之间的距离和位置的影响,并相应地播放给用户。此外还使用源对象和监听器对象的相对速度来模拟多普勒效应以增加真实感。

Unity 混音器 (Audio Mixer) 允许您混合各种音频源,对音频源应用效果,以及执行母带制作 (mastering)。

Unity 可以导入大多数标准音频文件格式,音频文件在 Unity 中 音频剪辑 Audio Clip

AIFF、WAV、MP3 和 Ogg 等格式的音频文件,只需要将文件拖入 Project 面板即可。

音频剪辑 Audio Clip

音频剪辑 Audio Clip 就是在 Unity 中实际发声的音频文件

Unity 支持单声道、立体声和多声道音频资源(最多八声道)

Unity 可以导入的音频文件格式包括:.aif、.wav、.mp3 和 .ogg。Unity 还能够导入 .xm、.mod、.it 和 .s3m 格式的音轨模块。

音频源 Audio Source

音频源 (Audio Source) 在场景中播放 音频剪辑 Audio Clip。

如果不为音频源指定音频剪辑,音频源不起作用。

音频源就像一个控制器,用于启动和停止该剪辑音源的播放,以及修改其他音频属性

核心属性:

  • Audio Clip: 将要播放的声音剪辑文件。

  • Output: 默认情况下,剪辑将直接输出到场景中的音频监听器 (Audio Listener)

  • Mute: 如果启用此选项,则为静音

  • Play On Awake: 如果启用此选项,声音将在场景启动时开始播放。如果禁用此选项,需要通过脚本使用 Play() 命令启用播放

  • Loop: 启用此选项可在音频剪辑结束后循环播放

  • Priority: 从场景中存在的所有音频源中确定此音频源的优先级。(Priority 值为 0 表示优先级最高。值为 256, 表示优先级最低。默认值为 128)

  • Volume: 设置声音的大小,但请注意,除了这个属性外,玩家听到的声音,与离音频监听器的距离成正比,以米为世界单位

  • Spatial Blend: 设置 3D 引擎对音频源的影响程度。

音频监听器 Audio Listener

音频监听器 (Audio Listener) 充当类似于麦克风的设备。它接收来自场景中任何给定音频源的输入,并通过计算机扬声器播放声音。对于大多数应用程序,最有意义的是将监听器附加到主摄像机。

音频监听器与音频源配合使用,可让您为游戏营造听觉体验。当音频监听器连接到场景中的游戏对象时,任何足够接近监听器的源都将被拾取并输出到计算机的扬声器。每个场景只能有 1 个音频监听器才能正常工作。

通常,应该将音频监听器连接到主摄像机或代表玩家的游戏对象。

注意:

  • 每个场景只能有一个音频监听器

Unity 中播放声音的基本使用步骤

通过 Unity 面板可视化控制

  1. 为当前场景配置 Audio Listener,可以连接到主摄像机,或玩家游戏对象(第一人称或第三人称追尾游戏);
  2. 将音频文件素材拖拽入 project 窗口,生成 音频剪辑 Audio Clip
  3. 创建空游戏对象,并为其添加 音频源 Audio Source 组件,用来配置管理 Audio Clip

使用代码

  • 方式一(一对一):为游戏中每个要播放声音的游戏对象都配置音频源组件,并绑定该音频源的音频剪辑,通过代码来控制该声音源组件来播放其中的音频剪辑;
  • 方式二(一对多):通过一个音频源,用代码控制播放多个不同的音频剪辑,使用 AudioSource 类对象的一个名为 PlayOneShot 的函数来实现