Unity2D入门—Pixel Adventure 1
第八章 场景跳转、开始与结束
前言
本章要实现场景跳转、樱桃继承以及开始与结束。
一、场景跳转
1、创建检查点
创建Checkpoint(检查点)的方法和之前一样,包括创建Sprite和创建动画,不过这里作者做一些改进,打算做一些改进(做一个类似于Checkpoint旗帜升起的功能, 具体方法是为旗杆设置两个动画,一是未升旗的动画,二是升旗的动画,我们只需要再Animator设置一个Trigger让动画由一转化到二就行了)。接着,再为Checkpoint添加碰撞体完成触发事件,记得注意勾选Is Trigger。最后,再为Checkpoint添加Audio Source组件来添加音效,注意记得叉掉Play On Awake。
2、控制脚本
我们编写了一个名为Finish的脚本,具体代码如下。这里就解释一下重点的几个地方。
private bool levelCompleted = false: 用于判断关卡是否已经完成。
Invoke(“CompleteLevel”, 2f): 2秒后调用CompleteLevel
方法。
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1): 当CompleteLevel方法被调用时,它会加载当前活动场景的下一个场景。这是通过获取当前场景的buildIndex(它在构建设置中的索引)并加1来实现的。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Finish : MonoBehaviour
{
private AudioSource finishSound;
private Animator anim;
private bool levelCompleted = false;
// Start is called before the first frame update
void Start()
{
finishSound = GetComponent<AudioSource>();
anim = GetComponent<Animator>();
}
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.gameObject.name == "Player" && !levelCompleted)
{
finishSound.Play();
anim.SetTrigger("victory");
levelCompleted = true;
Invoke("CompleteLevel", 2f);
}
}
private void CompleteLevel()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
}
}
3、复制新场景
这里我们需要复制一个新的场景,鼠标右键Create一个Scene, 第一个场景命名为Level1, 第二个场景命名为Level2, 并Ctrl+C将Level1的所有对象全部复制到Level2中,Level2我们做一些小改进,将背景涂成粉色以作为区分。接着,打开File - > Build Setting将Level2添加到项目中去,这样就可以实现跳转了。
二、樱桃数量继承
首先,我们写一个脚本用于控制全局樱桃的数量,我们将其命名为AllControl。在脚本中我们嵌套了一个GameManager类,实现单例模式。
using System.Collections;
using System.Collections.Generic;
using UnityEditor.Build.Content;
using UnityEngine;
public class AllControl : MonoBehaviour
{
public class GameManager
{
// 单例模式
private static GameManager _instance;
public static GameManager Instance
{
get
{
if (_instance == null)
{
_instance = new GameManager();
}
return _instance;
}
}
// 计分板数据
public int score = 0;
}
}
接着,我们去修改item_controller脚本,将其中的计数,替换为GameManage对象。脚本中添加了三行。
using static AllControl: 导入命名空间
int cherries = GameManager.Instance.score: 为cherries赋值
GameManager.Instance.score = cherries: 更新score值
using System.Collections;
using System.Collections.Generic;
using UnityEditor.Build.Content;
using UnityEngine;
using UnityEngine.UI; //这里是新添加的,需要自己手动导入,因为下面要使用的Text在这个包里面
using static AllControl;
public class items_controller : MonoBehaviour
{
//private int cherries = 0; //用于樱桃计数的
int cherries = GameManager.Instance.score;
[SerializeField] private Text cherriesText; //用于显示收集樱桃数量的
[SerializeField] private AudioSource collectSoundEffect;
//这段代码是一个Unity 2D游戏开发中常用的函数,它是用来处理2D碰撞事件的。
//具体来说,当一个物体(通常是拥有此脚本的物体)与一个带有Collider2D组件的物体发生碰撞并触发时,
//这个函数会被调用。
private void OnTriggerEnter2D(Collider2D collision)
{
//这里,我们检查发生碰撞的物体(collision.gameObject)是否带有标签 "Cherry"。
//CompareTag方法用于比较物体的标签是否与给定的字符串匹配。
if (collision.gameObject.CompareTag("Cherry"))
{
collectSoundEffect.Play();
Destroy(collision.gameObject); //销毁物体
cherries++; //更新计数
cherriesText.text = "Cherries:" + cherries; //更新UI显示
GameManager.Instance.score = cherries;
}
}
}
稍微总结一下,虽然这里实现了樱桃数量的继承但是在实际测试过程中,它会连死亡之前的数量一起继承。因此,大部分游戏中,我们还需要对收集樱桃的数量进行回滚等操作,但是在这里我们就不做尝试了,太懒了哈哈哈。
三、开始与结束
首先,我们先创建两个脚本分别为StartMenu胡EndMenu。由于很简单,代码部分就不在细说。
public class StartMenu : MonoBehaviour
{
public void StartGame()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
}
}
public class EndMenu : MonoBehaviour
{
public void ReloadGame()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex - 3);
}
}
接着,先创建Start场景,右键UI - > Panel(面板组件,参考 ),实际上就是一个容器,在其中可以放置其他的UI元素。这里我们可以用来制作注册和登录界面。然后,我们添加Image的UI组件、调节背景颜色、添加Text组件、Button组件、Audio Source组件、并将StartMenu脚本挂载到Button组件上。
然后为Button组件添加事件,这里我们点击Button的On Click (), 将Start脚本添加到其中,并选择其中对应的函数StartGame()。
对于结束场景,我们将开始场景复制一份,并修改挂载的组件、页面文字和BGM。
接着,最重要的一步,去Build Setting里面添加Start和End场景,我们的尝场景跳转都是基于此的,根据跳转顺序,我们将Start场景移动到最上面,也就是Index = 0上去。
总结
本章我们学会了实现场景跳转、创建单例模式去继承收集物的数量以及完成开始与结束场景的实现。这一章也是本项目的倒数第二章(你以为我会说是倒数第一章吗,嘻嘻),后面作者会再写一个总结的章节,用于回顾所学、发现问题以及思考新的玩法,可能后续作者会在这个项目上进行创新,也有可能再开一个新的项目,敬请期待吧。(最后的最后,再次感谢 秋梦夕 大佬的视频解说,最后贴图,散会)