Unity练习2 - 《John Lemon's Haunted Jaunt》-4- 结束游戏的UI

在本教程中,您将:

  • 使用 UI(用户界面)功能创建游戏结束屏幕
  • 创建 GameEnding 触发器
  • 编写自定义游戏结束脚本

✅ 设置UI

创建一个结尾,当 JohnLemon 逃离房屋时游戏实际上就完成了。

当 JohnLemon 到达出口时,游戏应该淡出并退出,但是您需要【注意】这一点:在 Unity Editor 中退出和在游戏的最终构建版本中退出是不同的。

首先,使游戏淡出。使用 Unity 的 UI(用户界面)系统

  • 在 Hierarchy 窗口中 Create > UI > Image。
  • 在 Scene 窗口中,单击 2D 以启用 2D 模式
  • 选择 Canvas 游戏对象。将鼠标光标置于 Scene 窗口上,并按 F 键。
image.png
  • 选择 EventSystem , Delete 掉。

EventSystem 游戏对象附带有一些组件,这些组件可协同工作以允许屏幕上的所有 UI 元素与用户输入进行交互。但是,本游戏中,玩家不必能够与 UI 进行交互,所以删掉。

✅ 配置画布 (Canvas)

将 Canvas 重命名为 FaderCanvas

image.png

它的 Transform 组件不同于之前看到的。UI 系统的游戏对象需要更好地控制其位置,因此具有 Rect Transform 组件。对于位于 UI 层级视图根部的 Canvas,Rect Transform 设置为只读

➡️ Render Mode

Canvas 组件可以控制如何渲染属于该 Canvas 的 UI 元素。此渲染主要由 Render Mode 设置进行控制。

渲染具有三种可能的模式:

  • Screen Space - Overlay,在这种模式下,画布将填充屏幕,画布的所有 UI 元素都会渲染在其他所有元素之上

  • Screen Space - Camera,在这种模式下,画布将填充屏幕,但会渲染到特定摄像机,并受到与摄像机的距离的影响

  • World Space,在这种模式下,UI 存在于场景中,并渲染到其他对象的前面或后面(例如,3D 世界中角色上方的名称标签)

我们需要在屏幕上拉伸图像,并将其渲染到其他所有元素之上, Screen Space - Overlay就很合适。

➡️ Canvas Scaler 组件

UI 元素在不同大小的屏幕上显示时,通过这个组件可以轻松控制 UI 元素的相对大小。图像会在整个屏幕上拉伸,因此无需担心其相对比例。

这里先Remove掉这个组件。

➡️ Graphic Raycaster 组件

这个组件用于检测 UI 事件,例如点击。
本游戏中,玩家不会与 UI 进行互动,因此不需要此组件,Remove掉。

✅ 拉伸图像

选择 Image 游戏对象 | 选择矩形工具 (Rect Tool),或按 T 键编辑对象

image.png

这里发现为什么图像不在矩形工具所指示的位置?

这是因为 Scene 窗口正在使用您在上一教程中设置的【后期处理】。

image.png

禁掉 Post Processing 就可以了:

image.png

✅ 配置 Rect Transform 组件

Rect Transform 组件的位置不是相对于其父对象上的单个轴心点,而是相对于其父对象的一个区域。父对象的此区域由 Rect Transform 的锚点表示。

这个雪花一样的图标,实际是四个锚点组成的:

image.png

由四个锚点形成的矩形是父对象整体区域的一部分。

image.png

锚点是相对于其父级的:0 表示屏幕的最左侧或底部,1 表示屏幕的最右侧或顶部。

  • 将 x 和 y 的最小值设置为 0。将 x 和 y 的最大值设置为 1。


    image.png

上面的示例中,图像的左边与锚定区域的左边相距 394 像素;图像的右边与锚定区域的右边相距 942 像素;图像的顶边与锚定区域的顶边相距 487 像素;而图像的底边与锚定区域的底边相距 145 像素。

image.png

将 Left、Top、Right 和 Bottom 属性设置为 0,颜色设为黑色(0,0,0)。

image.png

将当前的 Image 对象重命名为 ExitImageBackground, 在ExitImageBackground下面新建 Image 对象重命名为 ExitImage

image.png

ExitImage添加一张图片:

image.png

来解决一个重要的问题:图像填充尽可能大的屏幕面积将看起来效果最佳,但是需要保持正确的宽高比。要查看此问题,请像先前对待父级一样调整 Rect Transform 的大小。

  • 将 x 和 y 的最小值设置为 0。将 x 和 y 的最大值设置为 1
  • 将 Left、Top、Right 和 Bottom 属性设置为 0
image.png

图片现在看起来已经拉伸了!

image.png

找到 Image Type 属性。启用 Preserve Aspect 复选框,这样可以使图像在 Rect Transform 内尽可能增大,但不会被压缩或拉伸。

image.png

✅ 添加 Canvas Group 组件

接下来,考虑如何在需要时使这些 UI 元素淡入和淡出。我们可以调整 Image 组件的 Alpha 值以使其淡出。但是,现在有两幅图像(ExitImageBackgroundExitImage),因此需要更改两种颜色,而不是仅更改一个值。为了完成此任务,提供了一个名为 Canvas Group 的组件。

image.png

选择 ExitImageBackground 游戏对象 | 添加一个 Canvas Group 组件 | 将 Alpha改为 0

在 Scene 窗口中禁用 2D 模式, 切回关卡。 选择 JohnLemon 游戏对象。将鼠标光标悬停在 Scene 视图上,按 F 键以进行聚焦。

image.png

保存场景。

接下来,您需要一种触发和控制 UI 淡入淡出的方式。

✅ 创建 GameEnding 触发器

Create | Create Empty,命名为 GameEnding | Position 设置为 (18, 1, 1.5),这个位置在【关卡出口的中间】。

image.png

为 GameEnding 添加Box Collider 组件 | 启用 Is Trigger ,这会将碰撞体变成触发器。

调整触发器的大小,将 (Size) 设置为 (1, 1, 3.5),使其覆盖出口 — JohnLemon 需要走进这个出口才能逃出。

➡️ 创建 “GameEnding” 脚本挂载到GameEnding 游戏对象上

public class GameEnding : MonoBehaviour
{
    public float fadeDuration = 1f;  // 淡入淡出的默认值为1秒
    public float displayImageDuration = 1f;

    public GameObject player; // 玩家
    public CanvasGroup exitBackgroundImageCanvasGroup;
    bool m_IsPlayerAtExit;
    float m_Timer; // 需要一个计时器来确保游戏在淡入淡出之前不会结束

    void OnTriggerEnter(Collider other)
    {// 监听触发器callback
        if (other.gameObject == player)
        {
            m_IsPlayerAtExit = true; // 发生触发
        }
    }

    void Update()
    {
        if (m_IsPlayerAtExit)
        {
            this.EndLevel();
        }
    }

    void EndLevel()
    {
        //获取从上一帧以来经过的时间的方式:使用 Time.deltaTime
        m_Timer += Time.deltaTime;
        // 设置 Canvas Group 的 Alpha
        exitBackgroundImageCanvasGroup.alpha = m_Timer / fadeDuration;
        if (m_Timer > fadeDuration + displayImageDuration)
        {
            // 当计时器值大于持续时间时,淡入淡出将结束
            // 该方法确实可以退出游戏,但仅适用于完全构建的应用程序
            // 目前在Unity Editor中没有效果
            Application.Quit();
        }
    }
}
image.png

然后将 JohnLemon 游戏对象拖到的 Game Ending 的 Player 字段上。
将 ExitImageBackground 游戏对象拖到 Game Ending 的 Exit Background Image Canvas Group 字段上。Unity 将自动找到正确的组件来分配 Exit Background Image Canvas Group 变量。

保存场景。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容