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#实现将json转换为DataTable的方法

    C#实现将json转换为DataTable的方法

    这篇文章主要介绍了C#实现将json转换为DataTable的方法,涉及C#操作json及DataTable的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • Unity Shader片段着色器使用基础详解

    Unity Shader片段着色器使用基础详解

    顶点-片段着色器是Unity Shader中最基础的着色器类型,用于控制3D模型的渲染效果。通过顶点着色器计算模型的顶点位置和法线方向,再通过片段着色器计算模型表面的颜色、光照、阴影等效果
    2023-05-05
  • Unity通过代码修改按钮点击效果

    Unity通过代码修改按钮点击效果

    这篇文章主要为大家详细介绍了Unity通过代码修改按钮点击效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • c#深拷贝文件夹示例

    c#深拷贝文件夹示例

    这篇文章主要介绍了c#深拷贝文件夹示例,需要的朋友可以参考下
    2014-04-04
  • C# websocket及时通信协议的实现方法示例

    C# websocket及时通信协议的实现方法示例

    说到websocket大家一定不会陌生,WebSocket是HTML5一种新的协议。下面这篇文章主要给大家介绍了关于C# websocket及时通信协议的实现方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-11-11
  • C#检查字符串是否是合法URL地址的方法

    C#检查字符串是否是合法URL地址的方法

    这篇文章主要介绍了C#检查字符串是否是合法URL地址的方法,涉及C#字符串判断的相关技巧,需要的朋友可以参考下
    2015-05-05
  • WPF使用HLSL实现百叶窗动画效果

    WPF使用HLSL实现百叶窗动画效果

    百叶窗动画是制作PPT时常用的动画之一,本文将通过实现百叶窗动画效果的例子介绍在WPF中如何使用ShaderEffect,感兴趣的小伙伴可以了解一下
    2023-09-09
  • C# 实现TXT文档转Table的示例代码

    C# 实现TXT文档转Table的示例代码

    这篇文章主要介绍了C# 实现TXT文档转Table的示例代码,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-12-12
  • C#实现跨线程操作控件方法

    C#实现跨线程操作控件方法

    这篇文章主要介绍了C#实现跨线程操作控件方法,主要采用异步访问方式实现,需要的朋友可以参考下
    2014-10-10
  • 关于javascript冒泡与默认事件的使用详解

    关于javascript冒泡与默认事件的使用详解

    本篇文章是对javascript中冒泡与默认事件的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论