深圳大学计算机游戏开发-捡苹果

一、实验目的与要求

1. 熟悉Unity引擎基本概念。

2. 掌握利用Unity引擎制作游戏原型的基本方法。

3. 理解Unity利用C#语言进行编程的思想。

二、实验内容与方法

1.完成游戏原型(40)

按照“游戏原型:《拾苹果》.pdf”步骤(P337-P366),实现完整的拾苹果游戏原型。

2.完成修改内容一 5分)

按实验文档P367-后续工作-“欢迎界面”要求,添加游戏初始界面,要求包含游戏名称、“开始”按钮和个人学号姓名。点击“开始”按钮后,进入游戏。

3.完成修改内容二 5分)

按实验文档P367-后续工作-“Game Over界面”要求,添加游戏结束界面,要求包含“重新开始”按钮和最终得分展示,并提醒玩家是否打破了记录。

4. 游戏优化升级(5分)

自行发挥想象力,优化和完善游戏功能。

5. 录制游戏视频(5分)

录制游戏通关(失败)视频并上传。

6.完成实验报告 40分)

截图记录关键步骤,分析实验结果,撰写心得体会。

三、实验步骤与过程

1.完成游戏原型

1.1创建苹果树

苹果树由树干和树冠组成。树干使用一个圆柱体,树冠使用一个球体。创建完成后把这两个物体结合起来作为一颗完整的苹果树。

按教程要求设置圆柱,椭球,苹果树的位置和缩放。

图1-1:创建苹果树

在层级面板添加Rigidbody组件到AppleTree,并在菜单栏内执行Componet>Physics>Rigidbody命令,取消勾选AppleTree的Rigidbod组件的"Use Gravity",避免苹果树从天而降。

图1-2:取消勾选"Use Gravity"

1.2苹果树简单材质贴图

在菜单栏中执行Assets> Create> Material 命令,在项目面板中创建一个新的材质,将这个材质重命名为Mat_Wood。然后把Mat_Wood 材质拖动到场景或层级面板中的Trunk 对象上。再次选中Mat Wood,在检视面板中通过设置“Main Maps”选项,将白色 Mat Wood 颜色设置为棕色。

对于树冠(树叶)用同样的方法创建一个名为Mat_Leaves 的材质。然后拖拽到Leaves上。现在得到了一个有颜色的苹果树。

图1-3:苹果树材质贴图

1.3设置苹果树预设

把 AppleTree 从层级面板拖动到项目面板(Project面板中的Assests文件夹内),用它创建一个预设。与前面章节中样,这样会在项目面板中创建一个名为 AppleTree 的预设,并且层级面板中的AppleTree 会变为蓝色字体。

图1-4:苹果树预设

1.4灯光设置

设置灯光位置P:[0,20,0], R:[50,-30,0], S:[1,1]. 这会在场景中添加一束斜向穿过场景的平行光。注意,这里平行光源的位置并不重要(因为不论平行光源位置在哪,它都会照在所有物体上),但此处把它设置为[0,20,0],是为了把它移出场景中心位置,否则它的图标会出现在场景中心。

如果查看光的旋转效果会发现,场景中第一束平行光是和太阳一起绑定在 Unity 默认的 skybox 上的。Apple Picker 不会用到这个设计,但的确是个不错的3D 游戏效果。

图1-5:平行光

1.5创建苹果

现在苹果树已经做好了,接下来为下落的苹果制作游戏对象预设。创建一个球(Sphere)命名为Apple,设置P:[0,0,0], R:[0,0,0], S:[1,1]

创建一个名为Mat_Apple的材质,设置为红色。然后把Mat_Apple拖动到层级面板Apple游戏对象上.

图1-6:红苹果

接下来为苹果添加物理组件。在层级面板中选中 Apple,在菜单栏中执行 Component > Physics > Rigidbody命令。

最后,我们会希望获得屏幕上所有 Apple 游戏对象的一个数组,这可以通过为这些Apple 游戏对象添加Apple 标签来实现。如图1-7所示。

(1)在层级面板中选中 Apple,单击检视面板上的 Tag 旁边的弹出菜单,从中选择Add Tag (添加标签)菜单项。这会在检视面板中显示 Unity 的标签和图层管理器(Layers Manager)。

(2)单击 Tags 旁边的三角形展开按钮。

(3)在New Tag Name 栏中输入 Apple 并保存。此时 Apple已存在Tags列表中。

图1-7:标签和图层管理器

(4)现在,在层级面板中单击Apple,到Apple游戏对象的检视面板

(5)这时打开 Tag弹出菜单,可以看到 Tags 列表中多了一个 Apple。从列表中选择Apple。如图1-8所示,现在所有的苹果游戏对象都会有一个 Apple 标签,这样就更容易查找和选择它们了。

图1-8:标签Apple

1.6创建Apple预设

把 Apple从层级面板拖动到项目面板(Project面板中的Assests文件夹内),用它创建一个预设。与前面章节中样,这样会在项目面板中创建一个名为 Apple 的预设,并且层级面板中的Apple会变为蓝色字体。

图1-9:Apple预设

1.7创建篮筐

与其他绘图资源一样,程序员绘制篮筐也非常简单。

(1)在菜单栏中执行 GamcObject> 3D Object > Cube 命令,将新创建的立方体重命名为 Basket, 并按如下数值设置它的变换组件:Basket(Cube) P:[0,0,0] R:[0,0,0] S:[4,l,4],这会生成一个又扁又宽的长方体。

(2)现在新建一个名为 Mat_Basket 的材质,将它的颜色设置为一种低饱和度的浅黄色(类似于稻草颜色),并应用到 Basket 上。

(3)将 Rigidbody 组件添加到 Basket 对象中. 选中层级面板中的 Basket 对象并在Unity 菜单栏中执行 Component > Physics > Rigidbody 命令.

a. 设置 Basket 对象 Rigidbody 检视器的 Use Gravity 迭项为 false(未选中).

b. 设置 Basket 对象 Rigidbody 检视器的 Is Kinematic 迭项为 true(选中).

(4)把 Basket 从层级面板拖动到项目面板中,为其创建预设,阴后从层级面板中删除 Basket 的实例(和 Apple 游戏对象的操作相同).

(5)保存场景

现在的项目面板和层级面板应如图1-10所示.

图1-10:项目面板和层级面板

1.8摄像机设置

摄像机位置是游戏中最不能出错的内容之一。对于《拾苹果》游戏来说,我们希望摄像机显示一个大小适当的游戏区域。因为这个游戏的玩法完全是二维的,所以我们需要一个正投影(Orthographic)摄像机,而不是透视投影(Perspective)摄像机。

(1)在层级面板中选择主摄像机并将它的变换组件设置为以下效值:

Main Camera (Camera) P:[0,0,-10] R:(0,0,0] S:[l,l,l]

(2)这会使摄像机的视角下降 1 米 (Unity 中的一个单位等于1 米的长度),正好位于高度为 0 的位置。

a. 将 Camera 组件的 Projection 属性改为 Orthographic.

b. 将 Size 属性设置为 16.

这会使苹果树显示为合适大小,并为玩家抓住下落的苹果留出空间. 通常,需要大致猜测一下摄像机位置等数值,然后在试玩游戏的过程中做精细调整。和游戏开发的其他工作一样,要找到最佳的摄像机位置,是一个重复的过程。

图1-11:摄像机设置

1.9游戏面板设置

游戏视图另外一个重要因素是游戏面板的长宽比。

(1)游戏面板顶部的弹出式菜单会显示 Free Aspect, 即长宽比设置的菜单。

(2)单击长宽比设置菜单并选择 16:9. 这是宽屏电视和计算机显示器的标准格式,全屏玩游戏的效果不错。如果是 macOS 操作系统则应取消勾选低分辨率长宽比 (Low Resolution Aspect Ratios) 选项.

1.10苹果树代码

图1-12:苹果树游戏对象的动作流程图

我们需要为苹果树编写的代码如下:

  • 每帧都以一定的速度移动.
  • 当碰到游戏区域的边界时改变方向。
  • 随机改变方向.
  • 每秒落下一个苹果。

就这么简单!接下来,我们开始写代码.

首先按照教程填写AppleTree.cs,然后绑定到AppleTree预设上。

图1-12:AppleTree(Script)组件

然后更改Left And Right Edge为20, Change To Change Directions 改为 0.02。把改变方向的代码从Update函数中移动到FixedUpdate函数中。

    void FixedUpdate() {

        // 随机改变运动方向

        if (Random.value < changeToChangeDirections) {

            speed *= -1;  // 改变方向

        }

    }

这将导致 AppleTree 平均每秒随机改变 1 次方向。

1.11苹果代码

下面将介绍如何实现苹果的掉落

(1)在层级面板中选中AppleTree,然后在检视面板中查看 Apple Tree(Script)组件现在,Apple Prefab字段值为 None (Game Object),即暂未设置(括号里的Game Object 是让我们知道Apple Prefab字段的类型是游戏对象)。这个值应设置为项目面板中的Apple 预设。可以通过下面两种操作方法实现:

①单击Apple Prefab None(Game Object)右侧的小圆圈,然后从资源选项卡中选择Apple。

②或者把项目面板中的Apple 预设拖动到检视面板中的 Apple Prefab 中。

图1-13:设置Apple Prefab

然后在vs2019内将下而以粗体字表示的代码添加到 AppleTree 类中。

    void DropApple() {
        GameObject apple = Instantiate<GameObject>(applePrefab);
        apple.transform.position = transform.position;
        Invoke("DropApple", secondsBetweenAppleDrops);
    }

播放,然后看到苹果满屏幕乱飞。下面解决这个问题。

首先将苹果树的Rigidbody 组件设置为 kinematic, 即可以通过代码使苹果移动而不会与其他物体碰撞。

现在,虽然解决了苹果树移动的问题,但苹果与苹果树之间仍然会碰撞,导致其向两边掉落而非垂直下落。要解决这个问题,需要把苹果放在与苹果树不会发生碰撞的物理图层 (Physics Layer) 中。物理图层是指对象的分组,我们可以规定各组对象之间是否会发生碰撞。如果苹果树和苹果放在两个不同的物理图层中,并在图层管理器中规定两个图层不发生碰撞,这样苹果和苹果树也不会再撞到一起了。

图1-14:苹果向两边掉落

1.12设置游戏对象物理图层

首先,创建几个新物理图层,步骤如下。

(1)在层级面板中单击 AppleTree, 然后在检视面板中 Layer 旁边的下拉菜单中选择Add Layer (添加图层) 命令。这将在检视面板中打开标签和图层管理器 (Tags and Layers Manager), 可以从中设置 Layers 标签下物理图层的名字 (要看清楚,不要编辑Tags 或者 Sorting Layers 标签下的内容)。可以看到,从 Layer 0 到 Layer 7 是内置图层,显示为不可编辑的灰色。但可以编辑 Layer 8 到 Layer 31 之间的图层。

(2)将 Layer 8 命名为 AppleTree > Layer 9 命名为 Apple, Layer 10 命名为Basket。

图1-15:设置Layer

(3)在菜单栏中执行 Edit > Project Settings > Physics 命令,在检视面板中显示物理管理器 (Physics Manager). 物理管理器下方由复选框构成的图层碰撞矩阵表用来设置哪些物理图层可以互相碰撞,以及同一物理图层中的对象是否可以互相碰撞。

(4) 我们希望苹果与苹果果树或其他苹果都不发生碰撞,但仍然需要与篮筐碰撞。图层碰撞矩阵表如下。

图1-16:图层碰撞矩阵表

(5)正确设置完图层碰撞矩阵表之后,需要将游戏中的重要对象分配到图层之中.

a. 在项日面板中单击 Apple 预设. 然后在检视面板上部从 Layer 旁边的下拉菜单中选择 Apple 图层.

b. 在项目面板中选中 Basket, 将其图层设置为 Basket.

c. 然后在项目面板中选中 AppleTree, 将其图层设置为 AppleTrcc.

当选择 AppleTree 的物理图层时,Unity 会提示是否同时修改 AppleTree 和其子对象的图层,这里订定要选择 Yes, 因为需要修改构成 AppleTree 树干和树冠的圆柱和网球所在的物理图层. 这一修改也会传递给场景中的 AppleTree 实例, 可以单击层级面板中的 AppleTree 实例加以确认.

现在单击“播放”按钮,会看到苹果以正常方式从树上落下.

1.13在苹果下落一定距离后销毁苹果

如果让目前的程序多运行一会儿,会发现在层级而板中出现了很多 Apple 对象.这是因为程序每秒都会创建一个新的 Apple 实例,但从来不销毁它们。

(1)打开 Apple 脚本,在其中添加下面代码,使以果在下落超过一定距离之后被销毁 ( transform.position. y ==-20, 到达这个距离时,肯定落到屏幕之外了)

using UnityEngine;
public class Apple : MonoBehaviour {
    public static float bottomY = -20f;

    void Start() {

    }

    void Update() {
        if (transform.position.y < bottomY) {
            Destroy(this.gameObject);
    }
}

1.14实例化篮筐

要使篮筐对象工作,找们需要介绍一个概念,这个概念会在本书教程中反复出现.尽管面向对象的思维鼓励我们为每个游戏对象单.独创建一个类 (如 AppleTree和Apple), 但有时也需要在一个脚本中控制整个游戏的运行.

(1)把 ApplePicker 绑定到层级面板中的主摄像机上. 笔者经常把这类游戏管理脚木

绑定到主摄像机上,因为笔者确信每个场景都有一个主摄像机.

(2)在层级面板中单击主摄像机,在检视面板中将 basketPrefab 设置为之前创建的 Basket 游戏对象预设,然后单击播放按钮. 你会看到这段代码在加幕底部创建了三个篮筐

图1-16:篮筐

1.15让篮筐跟随鼠标移动

(1)在项目面板的篮筐预设中添加篮筐脚木.

(2)打开 Basket C#脚本,输入以下代码:

    void Update() {
        // 从 Input 中获取鼠标在屏幕中的当前位置
        Vector3 mousePos2D = Input.mousePosition;

        // 摄像机的 z 坐标决定在三维空间中将鼠标沿 z 轴向前移动多远
        mousePos2D.z = -Camera.main.transform.position.z;

        // 将该点从二维屏幕空间转换为三维游戏世界空间
        Vector3 mousePos3D = Camera.main.ScreenToWorldPoint(mousePos2D);

        // 将篮筐的 x 位置移动到鼠标处的 x 位置处
        Vector3 pos = this.transform.position;
        pos.x = mousePos3D.x;
        this.transform.position = pos;
    }

现在单击“播放”按钮,篮筐就可以移动了,可以使用篮筐碰到苹果,但还不能接住苹果。

1.16接住苹果

在 Basket 脚本中添加以下代码:

    void OnCollisionEnter(Collision coll) {
        // 检查与篮筐碰撞的是什么对象
        GameObject collidedWith = coll.gameObject;
        if (collidedWith.tag == "Apple") {
            Destroy(collidedWith);
        }
    }

到目前为止,游戏运行己经非常像我们要模仿的《炸弹人》游戏了,但它还缺少图形用户界面(graphical user interface. 简称 GUI)元素,例如得分或剩余生命数。但即使没有这些元素,《拾苹果》以目前状态也算是一个成功的原型游戏了

1.17记分器

在菜单栏中执行 GamcObject>UI>Tcxt 命令

这是在本场景中添加的第一个 uGUI(Unity 图形用户接口)元素,用于向层级而增加内容。首先你会看到画布(Canvas)。

在层级中选择 Text 游戏对象,并使用检视器面板将其重命名为 HighScore。然后进行如下设置。

图1-17:记分器设置

复制一个副本作为ScoreCounter,位置放在右边(Pos X = -10),其余都不变。

1.18每次接住苹果时为玩家加分

目前有了记分器但其实并不会记分。当苹果碰撞到篮筐时,Apple 和 Basket 脚本都会收到消息. 在本游戏中,Basket 脚本中己经有了一个 OnCollisionEnter() 方法,所以我们会修改这部分代码,让玩家每接到一个苹果就获得100分。然后更新到记分器。

在Basket脚本内加入以下代码。

    void Start() {
        // 查找ScoreCounter游戏对象
        GameObject scoreGO = GameObject.Find("ScoreCounter");
        // 获取该游戏对象的GUIText组件
        Text scoreGT = scoreGO.GetComponent<Text>();
        // 将初始分数设置为0
        scoreGT.text = "0";
    }
        // 将scoreGT转化为整数值
        int score = int.Parse(scoreGT.text);
        // 每次接住苹果就为玩家加分
        score += 100;
        // 将分数转换为字符串显示在屏幕上
        scoreGT.text = score.ToString();

图1-17:记分器(有效)

1.19未接住苹果时通知 Apple Picker 脚本

未接住苹果时结束本回合并销毁篮筐,可以让《拾苹果》感觉更像一个真正的游戏. 这时,由 Apple 负责销毁自身,这没有问题,但是 Apple 需要以某种方式将该事件通知 ApplePicker 脚本,以便让 Apple Picker 可以结束木回合并销毁其余的苹果,这涉及脚本间的相互调用。

首先在Apple.cs内进行如下修改。

    void Update() {
        if (transform.position.y < bottomY) {
            Destroy(this.gameObject);

            // 获取对主摄像机的ApplePicker组件的引用
            ApplePicker apScript = Camera.main.GetComponent<ApplePicker>();
            // 调用apScript的AppleDestoryed方法
            apScript.AppleDestroyed();
        }
    }

在ApplePicker.cs内加入以下代码:

    public void AppleDestroyed() {
        // 销毁所有下落中的苹果
        GameObject[] tAppleArray = GameObject.FindGameObjectsWithTag("Apple");
        foreach (GameObject tGO in tAppleArray) {
            Destroy(tGO);
        }
        // 销毁一个篮筐
        // 获取basketList中最后一个篮筐的序号
        int basketIndex = basketList.Count - 1;
        // 取得对该篮筐的引用
        GameObject tBasketGO = basketList[basketIndex];
        // 从列表中销毁该篮筐并销毁该游戏对象
        basketList.RemoveAt(basketIndex);
        Destroy(tBasketGO);

        // 如果没有篮筐剩余,重新开始游戏
        if (basketList.Count == 0) {
            SceneManager.LoadScene("Scene0");
        }
    }

1.20添加最高得分纪录

本节使用前文创建的 HighScore 文木游戏对象.

(1)新建一个名为 HighScore 的 C#脚本,将共绑定到层级面板中的 HighScore 游戏对象上.

(2)打开HighScore 脚本并添加以下代码:

这段代码将根据当前得分对最高得分进行更新,并且在 PlayerPrefs 中保存最高得分,以便下次运行时能够读取。

using UnityEngine;
using UnityEngine.UI;

public class HighScore : MonoBehaviour {
    static public int score = 1000;

    void Awake() {
        // 如果PlayerPrefs.HighScore已经存在,则读取其值
        if (PlayerPrefs.HasKey("HighScore")) {
            score = PlayerPrefs.GetInt("HighScore");
        }
        // 将最高得分赋给HighScore
        PlayerPrefs.SetInt("HighScore", score);
    }

    void Update() {
        Text gt = this.GetComponent<Text>();
        gt.text = "High Score: " + score;
        // 如有需要,则更新PlayerPrefs.HighScore
        if (score > PlayerPrefs.GetInt("HighScore")) {
            PlayerPrefs.SetInt("HighScore", score);
            Debug.Log(score);
        }
    }
}

2.完成修改内容一:欢迎界面

2.1创建场景

点击File > New Scene来创建一个新的场景,并保存为StartScene。

2.2设计开始界面

打开StartScene, 选择UI > Text添加一个文本元素Apple Picker,再添加一个文本元素LiangRunyu2021220003。然后选择UI > Button添加一个按钮,命名为StartButton,文字设为Start Now。

图2-1:开始界面

2.3设置按钮功能

首先写一个StartButton.cs,用于切换到Scene0

using UnityEngine;
using UnityEngine.SceneManagement;

public class StartButton : MonoBehaviour {
    public void StartGame() {
        SceneManager.LoadScene("Scene0");
    }
}

选中StartButton,在Inspector面板中找到Button (Script)组件,然后点击On Click ()部分的+按钮,添加一个新的事件。

将StartButton拖到新的事件框中,在事件框右边的下拉菜单中选择No Function > StartButton> StartGame().

点击按钮发现并没有跳转,并且报错Scene 'Scene0' couldn't be loaded because it has not been added to the build settings or the AssetBundle has not been loaded.

2.4添加场景管理器

刚刚报错是因为没有设置Build Settings。点击File > Build Settings,然后点击Add Open Scenes添加StartScene, Scene0, Scene1。

图2-2:添加场景到场景管理器

然后再点击StartButton,可以正常跳转。

现在,开始界面包含游戏名称、“开始”按钮和个人学号姓名。点击“开始”按钮后,进入游戏。

3.完成修改内容二:结束界面

按实验文档P367-后续工作-“Game Over界面”要求,添加游戏结束界面,要求包含“重新开始”按钮和最终得分展示,并提醒玩家是否打破了记录。

3.1创建场景

点击File > New Scene来创建一个新的场景,并保存为GameOverScene。

3.2设计结束界面

打开GameOverScene, 选择UI > Text添加Final Score,High Score,然后选择UI > Button添加按钮命名为RestartButton。

同时,为了提醒玩家是否打破最高分,还设置一个提示的tip.

3.3设置按钮功能

首先写一个RestartButton.cs,用于切换到Scene0

using UnityEngine;
using UnityEngine.SceneManagement;

public class RestartButton : MonoBehaviour {
    public void RestartGame() {
        SceneManager.LoadScene("Scene0");
    }
}

选中RestartButton,在Inspector面板中找到Button (Script)组件,然后点击On Click ()部分的+按钮,添加一个新的事件。

将RestartButton拖到新的事件框中,在事件框右边的下拉菜单中选择No Function > RestartButton> RestartGame().

3.4 解决得分显示

结束界面需要显示Final Score和High Score。创建GameOver.cs,添加到摄像机。在GameOver.cs内加入以下代码。

using TMPro;
using UnityEngine;
public class GameOver : MonoBehaviour {
    // Start is called before the first frame update

    void Start() {
        int highscore = PlayerPrefs.GetInt("HighScore");
        GameObject scoreHigh = GameObject.Find("HighScore");
        GameObject scoreFinal = GameObject.Find("FinalScore");
        GameObject tip = GameObject.Find("tip");
        // 获取该游戏对象的GUIText组件
        TMP_Text score1, score2, tips;
        score1 = scoreHigh.GetComponent<TMP_Text>();
        score2 = scoreFinal.GetComponent<TMP_Text>();
        tips = tip.GetComponent<TMP_Text>();
        score1.text = "High Score: " + highscore.ToString();
        score2.text = "Final Score: " + Basket.FinalScore.ToString();
        if (Basket.FinalScore == highscore)
            tips.text = "You broke the record!";
    }

    // Update is called once per frame
    void Update() {

    }
}

图3-1:结束界面计分板

4. 游戏优化升级

4.1音乐音效

在Unity内加入音乐比Cocos2d稍微复杂一些,这不是因为Unity麻烦而是因为Cocos2d过于朴素。

首先导入素材到Assets文件夹内,然后在场景中添加 AudioSource 组件。点击 Hierarchy 面板,选择 Create Empty添加 AudioSource 组件。选择刚刚创建的空 GameObject,在 Inspector 面板中点击 Add Component 按钮,搜索并添加 AudioSource 组件。

图4-1:Audio添加面板

在 Inspector 面板中,找到 AudioSource 组件,将导入的音乐文件拖动到 Audio Clip 字段中。勾选 Play On Awake 选项,这样当场景加载时音乐会自动播放。作为背景音乐应该循环播放,所以勾选 Loop 选项。

图4-2:Audio Source组件设置

bgm的设置完成后,继续设置接住苹果时的音效。

首先还是导入素材,设置AudioSource 组件。同时不勾选Play On Awake和Loop 选项。

创建SoundManager.cs拖到effect上。SoundManager.cs内容如下:

using UnityEngine;

public class SoundManager : MonoBehaviour {
    private AudioSource audioSource;

    void Start() {
        audioSource = GetComponent<AudioSource>();
    }

    // 播放音效
    public void PlaySound() {
        if (audioSource != null) {
            audioSource.Play();
        }
    }

    // 停止音效
    public void StopSound() {
        if (audioSource != null && audioSource.isPlaying) {
            audioSource.Stop();
        }
    }
}

然后在Basket.cs的OnCollisionEnter函数内加入soundManager.PlaySound();

现在,当苹果和篮筐碰撞时,就会播放音效。

4.2加入第二关

第二关变化:

  1. 苹果树移动速度加快,苹果掉落变多
  2. 新的bgm
  3. 每关的顶部居中显示关卡名
  4. 第一关结束后,结束界面内可选Next Level。第二关结束后,结束界面可选Previous Level。

在Scene1的Apple Tree实例内对苹果树速度,苹果掉落间隔,方向改变进行更改。

图4-3:第二关苹果树设置

新bgm:更换一个素材即可。

图4-4:更换bgm

每关顶部显示关卡名:直接添加UI-text即可。位置设置在Pos X:535

图4-5:关卡名

更新restart.cs,使其根据当前场景进行切换。

        // 如果没有篮筐剩余,重新开始游戏
        // 获取当前活动的场景
        Scene currentScene = SceneManager.GetActiveScene();

        // 获取当前场景的名称
        string sceneName = currentScene.name;
        if (basketList.Count == 0) {
            if (sceneName == "Scene0")
                SceneManager.LoadScene("GameOverScene0");
            else if (sceneName == "Scene1")
                SceneManager.LoadScene("GameOverScene1");
        }

然后就是在GameOverScene0和GameOverScene1里进行编辑,GameOverScene0里面有Next Level, GameOverScene1里有Previous Level。

图4-6:关卡切换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值