Unity游戏开发实现场景切换示例

目录
  • 引言
  • 一、实现逻辑
  • 二、代码实现
    • 2.1 Transition Manager
    • 2.2 Teleport
    • 2.3 Cursor Manager

引言

在unity中可以将不同场景的背景和道具放置在不同的Scene当中,通过对Scene的加载和卸载来实现场景之间的切换。同时创建一个基础场景(Control Scene)来对整个游戏系统进行管理,在基础场景(Control Scene)中不放置背景图片或者游戏道具而只添加各种控制单元和Canvas。

一、实现逻辑

在场景切换的实现过程中需要定义两个脚本,一个放在基础场景中作为控制管理单元,另一个添加到每一个场景中作为执行单元。 在每个场景中为场景切换的触发点单独添加一个空物体,为了能够检测到鼠标的点击为其添加一个Collider并设置为Trigger。此外在Teleport脚本中也定义了当前所在的场景和需要切换到的场景。每当鼠标点击场景切换的触发点时,Teleport向Transition Manager发出请求并调用Transition函数来实现场景切换。

    public void TeleportToScene()
    {
        TransitionManager.Instance.Transition(fromSceneName, toSceneName);
    }

二、代码实现

2.1 Transition Manager

状态参数的定义

    [SceneName] public string startScene;
    public bool isFading;//是否在进行场景切换
    public CanvasGroup canvasGroup;//用来在切换场景时禁用鼠标点击功能
    public float fadeDuration;//渐变持续时间
    public bool canTransition;//是否可以切换场景

场景切换的实现

    /// <summary>
    /// 场景切换API
    /// </summary>
    /// <param name="from"></param>
    /// <param name="to"></param>
    public void Transition(string from,string to)
    {
        if (!isFading&&canTransition)//不在场景切换渐变并且可以切换
            StartCoroutine(TransitionToScene(from, to));
    }
    /// <summary>
    /// 场景切换
    /// </summary>
    /// <param name="from"></param>
    /// <param name="to"></param>
    /// <returns></returns>
    private IEnumerator TransitionToScene(string from,string to)
    {
        yield return Fade(1);
        if (from != string.Empty)//当前场景不为空才能卸载
        {
            EventHandler.CallBeforeSceneUnloadEvent();
            yield return SceneManager.UnloadSceneAsync(from);//卸载当前场景
        }
        yield return SceneManager.LoadSceneAsync(to, LoadSceneMode.Additive);//叠加方式加载转换场景
        Scene newScene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);//获取新加载场景
        SceneManager.SetActiveScene(newScene);//激活新加载场景
        EventHandler.CallAfterSceneLoadedEvent();
        yield return Fade(0);
    }

渐入渐出效果的实现

    /// <summary>
    /// 实现场景切换的渐入渐出效果
    /// </summary>
    /// <param name="targetAlpha"></param>
    /// <returns></returns>
    private IEnumerator Fade(float targetAlpha)
    {
        isFading = true;
        canvasGroup.blocksRaycasts = true;//禁用鼠标
        float speed = Mathf.Abs(targetAlpha - canvasGroup.alpha) / fadeDuration;//渐变速度
        while(!Mathf.Approximately(canvasGroup.alpha, targetAlpha))
        {
            canvasGroup.alpha = Mathf.MoveTowards(canvasGroup.alpha, targetAlpha, speed * Time.deltaTime);
            yield return null;
        }
        canvasGroup.blocksRaycasts = false;
        isFading = false;
    }

2.2 Teleport

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 该脚本挂在每个子场景中,在场景切换时调用TransitionManager的Transition方法
/// </summary>
public class Teleport : MonoBehaviour
{
    [Header("切换的场景")]
    [SceneName] public string fromSceneName;
    [SceneName] public string toSceneName;
    public void TeleportToScene()
    {
        TransitionManager.Instance.Transition(fromSceneName, toSceneName);
    }
}

2.3 Cursor Manager

将场景切换触发点Tag设置为"Teleport",并通过实时检测来确实是否进行场景切换。

    /// <summary>
    /// 点击物品的活动反馈
    /// </summary>
    /// <param name="clickObject">点击的物品</param>
    public void ClickAction(GameObject clickObject)
    {
        switch(clickObject.tag)
        {
            case "Teleport":
                var teleport=clickObject.GetComponent<Teleport>();
                teleport?.TeleportToScene();
                break;
        }
    }

通过OverlapPoint判断物体是否和鼠标碰撞

    /// <summary>
    /// 物品是否在鼠标位置
    /// </summary>
    /// <returns></returns>
    private Collider2D ObjectAtMousePos()
    {
        return Physics2D.OverlapPoint(mouseWorldPos);
    }

最后在Update里面实时更新检测

    private void Update()
    {
        canClick = ObjectAtMousePos();//物品是否能够点击
        if(canClick&&Input.GetMouseButtonDown(0))
        {
            //检测鼠标和物体的交互情况
            ClickAction(ObjectAtMousePos().gameObject);
        }
    }

以上就是Unity游戏开发实现场景切换示例的详细内容,更多关于Unity游戏开发场景切换的资料请关注我们其它相关文章!

(0)

相关推荐

  • Unity制作游戏自定义按键详解

    目录 一.效果图 二.布局 1.场景布局 2.设置面板布局 三.脚本思路 1.KeyItem脚本 2.SetKeyPanle脚本 3.player移动脚本 一.效果图 二.布局 1.场景布局 创建一个Panel 创建三个cube,Panel地板 两个cube设置一个绿色材质,调整Scale大小让其成为柱子形状,一个cube改名为player设置一个红色材质,当作玩家(用来演示操作的),修改相机位置就可以了. 2.设置面板布局 2.1新建一个空节点名字改为SetKeyPanle,修改属性 2.2在

  • Unity游戏开发之射击小游戏的实现

    目录 前言 游戏画面展示 游戏代码解析 游戏打包 总结 前言 人们一直都说学习和玩游戏不能兼顾,那我们就来边学习怎样制作游戏,边玩游戏 不就兼得了嘛~ 我可真是一个小天才呢~ 所以本篇文章为大家带来一个 横版2D射击小游戏,游戏制作超级简单,玩法一学就会, 一起来看看吧! 游戏画面展示 这款小游戏只用了两个UI界面,一个是菜单界面,另一个是战斗界面 菜单界面有三种模式,分别是一般.困难和地狱 战斗界面就是很简单的从两边刷野怪,然后主角开枪打死他们 UI搭建很简单,只有一张背景图使用Image,加

  • Unity游戏开发实现背包系统的示例详解

    目录 引言 一.UI设计 二.UI 2.1 Slot中的物品显示 2.2 物品切换 2.3 SlotUI的实现 2.4 物品描述信息的展示 三.数据 四.逻辑 引言 背包是游戏中经常使用的一个组件,它负责管理玩家在游戏中所获得的道具.一个完整的背包系统应当具有将物品放置进背包.对背包内物品进行管理和使用背包内物品等功能.而往往一个背包系统的逻辑关系较为复杂,如果把所有功能都放在一个脚本中实现会使代码显得十分冗杂且缺乏逻辑.所以在背包系统的设计过程中,我们常将其分解为数据.逻辑和UI三部分分别来进

  • Unity游戏开发之2048游戏的实现

    目录 一.前言 二.游戏开发知识储备 2-1技术栈 三.休闲类游戏<2048>开发实战 3-1玩法概述 3-2实现分析 3-3搭建场景 3-4实现代码 一.前言 写今天这篇文章的缘由,其实是来自于前段时间和粉丝的一个聊天,最近他打算参加游戏创作大赛,问我需要准备学习什么知识,以及参加比赛的注意事项一类: 我相信因为热爱游戏而前来投身于U3D学习的粉丝想来不是少数,兴趣可以驱动学习,在完善自己心爱游戏的过程中,要不断的去学习,不断的提高自己. 而参与游戏设计比赛,更是提高自身技术实力.增长眼界见

  • 基于Unity3D实现3D迷宫小游戏的示例代码

    目录 一.前言 二.构思 三.正式开发 3-1.搭建场景 3-2.设置出入口 3-3.添加角色 3-4.实现角色移动 3-5.出入口逻辑 四.总结 一.前言 闲来无事,从零开始整个<3D迷宫>小游戏. 本篇文章会详细介绍构思.实现思路,希望可以帮助到有缘人. 二.构思 首先,要实现一个小游戏,心里肯定要有一个大概的想法,然后就是将想法完善起来. 我的想法就是一个用立体的墙搭建的迷宫,然后控制人物在迷宫中移动,最后找到出口,就这么简单. 当然,这是一个雏形,比如可以加点音效.背景.关卡.解密等.

  • Unity3D实现甜品消消乐游戏

    目录 前言 项目效果展示 项目概况 素材展示 场景展示 场景元素 玩法介绍 版本说明 项目源码 前言 解释: 之前用的ScreenToGif录屏,因为上传的.gif最大不超过5MB,所以做了不少删帧和色彩弱化等处理,这才导致色彩看上去不是很舒服,不要盯着它看太久,不然会有点难受... 由于使用的素材是现成的,没有花时间精力去扒,所以细节方面可能不是做的很好. 说明: 这次的甜品消消乐虽然看上去好像挺简单普通的,但是相对于之前的坦克大战,某种程度上已然提升难度了,归类到了算法类层的游戏. 拉到最后

  • Unity游戏开发实现场景切换示例

    目录 引言 一.实现逻辑 二.代码实现 2.1 Transition Manager 2.2 Teleport 2.3 Cursor Manager 引言 在unity中可以将不同场景的背景和道具放置在不同的Scene当中,通过对Scene的加载和卸载来实现场景之间的切换.同时创建一个基础场景(Control Scene)来对整个游戏系统进行管理,在基础场景(Control Scene)中不放置背景图片或者游戏道具而只添加各种控制单元和Canvas. 一.实现逻辑 在场景切换的实现过程中需要定义

  • Unity游戏开发之炸弹人游戏的实现

    目录 前言 制作思路 开始制作 第一步:游戏场景制作 第二步:墙体代码 第三步:炸弹人制作 第四步:炸弹处理 第五步:敌人制作 第六步:游戏控制器 第七步:UI控制器 前言 大家小时候肯定玩过这款游戏,炸弹人也算是经典中的经典啦~ 希望看到这篇小游戏,可以让你重拾童年跟小伙伴一起对着大屁股电视机玩游戏的美好时光! 时间在慢慢的流逝,那些陪你一起度过童年的小伙伴有多久没联系了呢~ 看完这篇炸弹人,有时间的话就找自己童年的小伙伴们聊会天吧,一起找回童年的回忆和梦想! 回归主题,炸弹人小游戏制作开始!

  • Cocos2d-x UI开发之场景切换代码实例

    cocos2d-x中的场景切换是通过导演类调用相应的方法完成的,可以通过CCDirector::sharedDirector()->replaceScene()方法切换场景,参数是要切换的新场景,这种方法会释放掉旧的场景.通过pushScene()切换则是将旧的场景压入到栈中,以便通过popScene()函数出栈,继续运行原场景.刚开始程序启动的时候通过runWithScene()运行一个新的场景.下面通过代码来说明.单击下图可以查看效果. 这次代码一共建立了俩个场景,一个是原来的hellowo

  • C#在Unity游戏开发中进行多线程编程的方法

    在这之前,有很多人在质疑Unity支不支持多线程,事实上Unity是支持多线程的.而提到多线程就要提到Unity非常常用的协程,然而协程并非真正的多线程.协程其实是等某个操作完成之后再执行后面的代码,或者说是控制代码在特定的时机执行.而多线程在Unity渲染和复杂逻辑运算时可以高效的使用多核CPU,帮助程序可以更高效的运行.本篇主要介绍在Unity中如何使用多线程. 首先引入C#中使用多线程的类库 using System.Threading; 创建线程实例的四种方式 一.线程执行无参方法 构造

  • 游戏开发进阶Unity网格(Mesh\动态合批\骨骼动画\蒙皮)

    目录 一.前言 二.Hello Mesh 三.萌新初识Mesh 1.引擎内置的Mesh 2.Mesh是什么 三.Mesh的创建方式 1.第三方建模软件 2.Unity建模插件:ProBuilder 3.程序动态生成网格 四.Unity中如何显示网格 1.MeshFilter:网格过滤器 2.MeshRenderer:网格渲染器 3.SkinnedMeshRenderer:蒙皮网格渲染器 3.1 骨骼动画 3.2 SkinnedMeshRenderer组件 3.2 使用BakeMesh进行优化 五

  • unity实现场景切换进度条显示

    本文实例为大家分享了unity实现场景切换进度条显示的具体代码,供大家参考,具体内容如下 一.UI.建立slider适当更改即可: 二.新增loadScene脚本,用来进行场景切换,将其绑定任意物体上面.博主以放置主相机为例.参数分别为进度条(用来设置value值),显示进度文本text: 在设置中加入两个场景: 三.脚本: /// <summary> /// 场景切换 /// 在unity 获取当前加载进度progress中,其中最多到0.9.只有等到加载到第二个场景才会到1 /// 所有在

  • Android 游戏开发入门简单示例

    在Android系统上开发游戏是Android开发学习者所向往的,有成就感也有乐趣,还能取得经济上的报酬.那怎样开发Android游戏呢?下面介绍一个简单的入门实例.        一.创建新工程 首先,我们在Eclipse中新建一个名为Movement的工程,并且选择合适的Android SDK,在这里,我们选用的API是比较低的1.5版本,这样可以让其适应性更强.接下来,我们新建两个类,一个是UpdateThread类,一个是SurfaceView类,它们在项目中分别是负责处理线程和画面的两

  • Android开发实现自动切换文字TextSwitcher功能示例

    本文实例讲述了Android开发实现自动切换文字TextSwitcher功能.分享给大家供大家参考,具体如下: 介绍: 1.TextSwitcher是ViewSwicher的一个子类,继承了ViewSwicher的所有方法 2.与ViewSwitcher的另一个子类类似,TextSwitcher也有 3.ImageSwitcher不同的是:TextSwitcher的ViewFactory方法的 makeVieW() 必须放回一个TextXiew组件. 具体效果: 放射思维: 如果将其和轮播图(h

随机推荐