Unity入门实战(Pixel Adventure 1)- 8

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上去。
在这里插入图片描述


总结

本章我们学会了实现场景跳转、创建单例模式去继承收集物的数量以及完成开始与结束场景的实现。这一章也是本项目的倒数第二章(你以为我会说是倒数第一章吗,嘻嘻),后面作者会再写一个总结的章节,用于回顾所学、发现问题以及思考新的玩法,可能后续作者会在这个项目上进行创新,也有可能再开一个新的项目,敬请期待吧。(最后的最后,再次感谢 秋梦夕 大佬的视频解说,最后贴图,散会)

请添加图片描述

  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值