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

 更新时间:2022年08月11日 16:32:41   作者:lucky_  
这篇文章主要为大家介绍了Unity游戏开发实现场景切换示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

在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游戏开发场景切换的资料请关注脚本之家其它相关文章!

相关文章

  • C#使用分部类设计实现一个计算器

    C#使用分部类设计实现一个计算器

    分部类是C#4.5中的一个新特性,它的出现使得程序的结构更加合理,代码组织更加紧密,本文将使用分部类设计实现一个简单的计算器,感兴趣的小伙伴可以了解下
    2024-02-02
  • C# 动态调用WebService的示例

    C# 动态调用WebService的示例

    这篇文章主要介绍了C# 动态调用WebService的示例,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-11-11
  • C#自定义类型强制转换实例分析

    C#自定义类型强制转换实例分析

    这篇文章主要介绍了C#自定义类型强制转换的方法,实例分析了C#类型转换的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Unity工具类之生成文本验证码

    Unity工具类之生成文本验证码

    这篇文章主要为大家详细介绍了Unity工具类之生成文本验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • C#操作RabbitMQ的完整实例

    C#操作RabbitMQ的完整实例

    这篇文章主要为大家详细介绍了C#操作RabbitMQ的完整实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • C#画笔Pen使用路径绘制图形的方法

    C#画笔Pen使用路径绘制图形的方法

    这篇文章主要介绍了C#画笔Pen使用路径绘制图形的方法,涉及C#使用画笔精确控制绘图轨迹的相关技巧,需要的朋友可以参考下
    2015-06-06
  • c#反射表达式树模糊搜索示例

    c#反射表达式树模糊搜索示例

    这篇文章主要介绍了c#反射表达式树模糊搜索示例,反射实体T,非datetime字段反射获取表达式树,需要的朋友可以参考下
    2014-02-02
  • c#中使用BackgroundWorker的实现

    c#中使用BackgroundWorker的实现

    本文主要介绍了c#中使用BackgroundWorker的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • C#实现备忘录功能

    C#实现备忘录功能

    这篇文章主要为大家详细介绍了C#实现备忘录功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • ajaxFileUpload插件,C#返回Json数据报错问题的解决方案

    ajaxFileUpload插件,C#返回Json数据报错问题的解决方案

    这篇文章主要介绍了ajaxFileUpload插件,C#返回Json数据报错的解决方案,需要的朋友可以参考下
    2017-12-12

最新评论