Unity游戏开发:场景切换的实现

这篇具有很好参考价值的文章主要介绍了Unity游戏开发:场景切换的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

一、实现逻辑

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

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

unity多个场景切换,Unity游戏开发,unity,游戏,游戏引擎,c#,游戏程序

二、代码实现

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",并通过实时检测来确实是否进行场景切换。
unity多个场景切换,Unity游戏开发,unity,游戏,游戏引擎,c#,游戏程序

    /// <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里面实时更新检测文章来源地址https://www.toymoban.com/news/detail-558154.html

    private void Update()
    {
        canClick = ObjectAtMousePos();//物品是否能够点击

        if(canClick&&Input.GetMouseButtonDown(0))
        {
            //检测鼠标和物体的交互情况
            ClickAction(ObjectAtMousePos().gameObject);
        }
    }

到了这里,关于Unity游戏开发:场景切换的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(78)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(66)
  • Unity使用进度条加载实现场景切换(简单方法)

     我们实现场景切换时一般使用方法:  这种方法可以实现场景页面的直接切换,但在切换场景前想加这种进度条的方式该如何实现呢? 接下来小编为大家讲解一种非常简单的方法供参考。 1.找一张实现页面切换的背景图片(任何图片都可),记得将其改为“精灵模式”。

    2024年02月13日
    浏览(56)
  • unity场景转换(实现开始游戏和返回游戏)

    1、新建两个场景,一个命名为start,另一个命名为game,如下图 2、打开start,创建一个平面和一个按钮(右键,UI,Button),平面绕X轴旋转-90度,按钮的text设置为开始游戏,把按钮拖到场景中合适的位置,如下图 3、编写代码start,把它赋给Canvas,注意是赋给Canvas,不是给按钮,代

    2024年02月11日
    浏览(43)
  • 项目实训--Unity多人游戏开发(十一、PUN框架--游戏场景篇(加载与同步))

    本地加载 有许多方法,举几个例子: 本地加载 本地异步加载(场景内容过多时,防止卡顿异步加载) 多人游戏加载场景 pun2插件加载 这个异步加载起初是觉得场景内容如果过多会引起卡顿。所以把这个应用在了单机模式上。 至于多人游戏加载场景,可能用不到而且也没法

    2024年02月01日
    浏览(63)
  • unity多个物体多种材质切换效果实现方法(方法比较笨,还有不足之处多多指导)

    多种材质切换:获取物体的MeshRenderer组件上所有的材质球,并将其存放到数组中;创建另一个数组存放需要新材质球,通过循环遍历将将需要替换的材质球存放在创建好的数组内。 比如说同时给象棋的棋盘和棋子切换不同材质,具体步骤如下: 1.分别导入棋盘、棋子模型;黑

    2024年02月17日
    浏览(50)
  • Unity 开发人员转CGE(castle Game engine)城堡游戏引擎指导手册

    一、简介 2. Unity相当于什么GameObject? 3. 如何设计一个由多种资产、生物等组成的关卡? 4. 在哪里放置特定角色的代码(例如生物、物品)?Unity 中“向 GameObject 添加 MonoBehaviour”相当于什么? 5.Unity子目录相当于什么Assets? 6. 支持哪些模型格式? 7. 支持FBX模型格式吗? 8.

    2024年02月07日
    浏览(79)
  • Unity切换场景保存上一个场景的数据,Unity切换场景的案例,Unity切换场景再返回数据丢失的解决方案

    Unity在切换场景之后在再次返回上不会保存上一个场景的数据的。 但是大多数时候我们是需要这些数据的,这应该如何解决呢? 文件链接:我将解决方案打包了,点我下载,免费,或者私信我发你 首先将需要存储到一个class中,这里以学生为例子 然后我们再创建一个脚本,

    2024年02月02日
    浏览(49)
  • 游戏开发常用引擎工具介绍对比区别(UE4,Unity,Cocos,LayaAir,[egret-白鹭])

    是一套为开发实时技术而存在的引擎工具。目前广泛应用于3D建模渲染、游戏开发中。它完善的工具套件以及简易的工作流程能够使开发者快速修改或查看成果,对于代码的依赖性很低。而完整公开的源代码则能让使用者自由修改和扩展引擎功能。 是面向开发人员的 3D/2D 游戏

    2024年02月13日
    浏览(68)
  • 吐槽laya:H5小游戏开发应该用什么引擎好?laya、cocos还是unity?

    我看有人推荐laya,放在H5小游戏的前三排名,这压根不靠谱。 laya只能算个半成品,整体非常垃圾,如果是首次选择游戏引擎,至少转去cocos,实在选laya,那也没办法了。 下面说说laya有什么问题,如果只是一些简单的bug什么的,我是不会花这个时间吐槽的,但是如下的问题实

    2024年02月13日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包