unity场景切换 场景预加载 与loading页面加载进度条显示

关于场景转换和loading页

我们玩游戏的时候,在进入游戏或场景切换的时候一般都会有一个loading页面。通过这个Loading可以方便的知道当前加载进度,加载速度,并可以通过一些无耻下流的手段来缓解玩家的不安情绪。

实现思路

专门建立一个loading的场景,然后每次场景切换时我们都先记录好目标场景的名称或序号,然后先载入loading场景,并在loading场景中加载目标场景的资源并显示出来,当加载完成后,再由loading场景切换到目标场景。这样的好处多多,比如loading页面的内容可以集中管理,甚至是多次复用~

实现步骤

1,创建场景控制脚本

创建一个脚本铭文SceneController。需要注意这个脚本中的类是静态的。这就意味着我们可以在任何脚本中直接调用该脚本中的静态方法。
我在脚本中内置了一些方法,他允许你可以使用更多的体位去切换场景。比如通过场景名称切换,通过场景序号切换,直接按顺序切换上一个/下一个场景等

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using System;

public static class SceneController
{
	// 场景列表,这里填写的都是你已经存在的scene 的场景名
    public static ArrayList sceneNames = new ArrayList() {
        "Structure",
        "RobotCount",
        "RobotShow",
        "Monitor",
    };
    // 自定义loading名,在这里使用它是因为别的需求,如果你的需求比较简单可以直接写死
    public static string LoadingSceneName = "Loading";
    // 定义一个回调事件  当完成任何场景切换时触发
    public static Action AfterGoToScene;

    // 即将切换场景的序号
    public static int sceneIndex = -1;
    // 根据场景顺序,切换到下一个场景的方法
    public static void GoToNextScene()
    {
        if (SceneController.sceneIndex < SceneController.sceneNames.Count - 1)
        {
            SceneController.sceneIndex++;
            GoToSceneByIndex(SceneController.sceneIndex);
        }
    }
    // 根据场景顺序,切换到上一个场景
    public static void GoToPrevScene()
    {
        if (SceneController.sceneIndex > 0)
        {
            SceneController.sceneIndex--;
            GoToSceneByIndex(SceneController.sceneIndex);
        }
    }

	// 根据场景名称(scene name) 切换到目标场景 (scene index会跟着变动)
    /// <summary>
    /// goto the scene if finded name in scenelist,atherwase reopen current scene 
    /// </summary>
    /// <param name="sceneName"></param>
    public static void GoToSceneByName(string sceneName)
    {
        if (SceneController.sceneNames.Contains(sceneName))
        {
         	GoToSceneByIndex(SceneController.sceneNames.IndexOf(sceneName));
        }
    }
	//根据 场景序号切换到目标场景
    public static void GoToSceneByIndex(int sceneIndex)
    {
        if (SceneController.sceneIndex >= 0 && SceneController.sceneIndex < SceneController.sceneNames.Count)
        {
            SceneController.sceneIndex = sceneIndex;
            // 混合加载部分 本篇请无视
            // 设置总加载量和detailstxt
            // Loading_Controller.custom_totalStep = (string)SceneController.sceneNames[SceneController.sceneIndex] switch
            //{
               // "Monitor" => 6f,
              //  _ => 1f,
            ///};

            SceneManager.LoadScene(LoadingSceneName);
            AfterGoToScene?.Invoke();
        }
    }
    // 根据目标场景名称 注销目标场景,这个只是为了统一管理,因为unity早就内置了方法
    public static void UnLoadSceneByName(string sceneName)
    {
        SceneManager.UnloadSceneAsync(sceneName);
    }
    // 根据目标场景序号 注销目标场景
    public static void UnLoadSceneById(int sceneID)
    {
        SceneManager.UnloadSceneAsync((string)SceneController.sceneNames[sceneID]);
    }
}

2,创建一个Loading专用场景

首先在编辑器中创建一个scene,起名为Loading。然后分别添加image、text对象。这里我使用的是meshprotext,建议大家都使用这个而不是unity自带的txt。可以有效解决文字失真、锯齿的问题。
在这里插入图片描述
点击image查看inspector窗口,将Image中的Image Type设置为Filled,Fill Method设置为Horizontal

在这里插入图片描述
在场景中,通过拖拽将txt和image摆成这个样子就完成了
在这里插入图片描述

3,创建Loading脚本

创建一个名为LoadingController.cs的脚本,复制以下代码,保存后将脚本拖到场景中任意物体上。该脚本的作用是当进入loading场景时,开始加载目标场景的资源。捕获加载进度制作进度条,当加载完成后再跳转到目标场景。

```csharp
using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using System;
using mLib;

public class Loading_Controller : MonoBehaviour
{
	// 加载进度显示
	public TextMeshProUGUI progressText;
	// 进度条
    public Image progressBar;
	// 目标异步场景
    private AsyncOperation asyncOperation;

    void Start()
    {
        // 协程启动异步加载
        StartCoroutine(this.AsyncLoading());
    }

    IEnumerator AsyncLoading()
    {
        this.asyncOperation= SceneManager.LoadSceneAsync((string)SceneController.sceneNames[SceneController.sceneIndex]);
        //终止自动切换场景
        this.operation.allowSceneActivation = false;
        yield return operation;
    }
    void Update()
    {
        // 获取加载进度,让进度条动起来
        this.SettingLoadingUI(this.asyncOperation.progress);
        // 当进度大于0.9时就已经加载完毕
        if (this.asyncOperation.progress >= 0.9f)
        {
            // 允许切换。将在下一帧切换场景
            this.operation.allowSceneActivation = true;
        }
    }
    public void SettingLoadingUI(float progress )
    {
    	// 百分比的方式显示进度
        this.progressText.text = (progress*100f).ToString() + "%";
        // 通过改变image的宽度来实现进度条
        this.progressBar.fillAmount = progress;
    }
}
4 绑定UI

点击脚本所在的物体,在他的inspector窗口中找到脚本控件,将之前创建的image,txt拖到控件中的响应位置后保存场景即可

5 使用

当我们在某个场景中,需要切换到新场景时,那么只需触发相应方法就能实现了。该方法会让你的场景先切换到Loading场景,当目标场景的资源加载完成后再从Loading场景中切换过去

// 切换到目标场景
SceneController.GoToSceneByName("RobotCount");

需要注意的是场景列表中的名称一定是真实有效的,并且确定所有场景都必须已经在biulding settings中已经注册了

public static ArrayList sceneNames = new ArrayList() {
        "Structure",
        "RobotCount",
        "RobotShow",
        "Monitor",
    };

关于混合资源加载

你可能已经发现。该方法只能加载场景内资源。也就是和场景中存在的资源。如果你有对本地资源、网络资源的加载需求,又或者是混合的加载需求该怎么办呢?
答案是混合加载。只需要将Loading页面扩展一下就可以实现。
相关方法请查看这篇文章unity Loading页面,实现本地、网络资源的混合加载

  • 11
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Unity加载多个场景的方法有两种:一种是使用SceneManager.LoadSceneAsync()方法,另一种是使用SceneManager.LoadScene()方法配合使用异步加载的方式。 第一种方法是使用SceneManager.LoadSceneAsync()方法,该方法可以异步加载一个场景。可以通过创建AsyncOperation对象,然后调用SceneManager.LoadSceneAsync()方法传入场景名称或场景索引来实现加载。可以通过设置AsyncOperation.allowSceneActivation属性来控制是否立刻激活场景。 如果要加载多个场景,则可以在一开始创建多个AsyncOperation对象,然后分别调用SceneManager.LoadSceneAsync()方法去加载不同的场景,最后使用AsyncOperation.isDone属性来判断是否加载完成。可以在加载完成后,再通过调用SceneManager.SetActiveScene()方法将需要加载场景设置为活动场景。 第二种方法是使用SceneManager.LoadScene()方法配合使用异步加载的方式。可以先调用SceneManager.LoadScene()方法去加载一个主场景,然后在该场景中使用异步加载的方式去加载其他的场景。可以通过创建AsyncOperation对象,再调用SceneManager.LoadSceneAsync()方法传入其他场景的名称或索引来实现加载。可以通过设置AsyncOperation.allowSceneActivation属性来控制是否立刻激活场景。 以上两种方法都可以实现加载多个场景的效果,在游戏中需要使用到的场景可以提前加载好,提高游戏的加载速度和性能。 ### 回答2: Unity是一款游戏引擎,可以实现加载多个场景来提高游戏的流畅度和体验。 在Unity中,可以使用异步加载场景的方法来实现加载多个场景。首先,需要在场景管理器中设置需要加载场景,然后使用SceneManager.LoadSceneAsync方法来异步加载场景加载场景时,可以将加载进度显示给玩家,让他们了解加载的进展情况。可以通过AsyncOperation的progress属性来获取当前加载的进度,并将其转化为百分比显示。 在加载场景时,如果需要进行一些后台操作或初始化工作,可以使用协程Coroutine来实现,这样加载场景时,可以在后台进行额外的操作,提高游戏的加载效率。 要加载多个场景,可以使用多个AsyncOperation进行异步加载。使用SceneManager.LoadSceneAsync方法加载多个场景,并使用协程来控制加载的顺序和等待时间。 在加载多个场景时,可以根据游戏的需要来决定加载的优先级,高优先级的场景可以先加载,以保证玩家能够尽快进入游戏。 加载多个场景可以提前加载游戏中需要使用的资源场景,减少加载时间和闪烁现象,提高游戏的流畅度和用户体验。 总之,通过Unity中的异步加载场景和协程,我们可以方便地加载多个场景,提高游戏的性能和用户体验。 ### 回答3: Unity是一款强大的游戏开发引擎,可以通过加载多个场景来提高游戏的性能和流畅度。 在Unity中,加载多个场景可以通过以下步骤实现: 1. 创建多个场景:在Unity编辑器中,首先创建多个需要加载场景。可以使用菜单栏中的"File" -> "New Scene"来创建新的场景,并按照需求进行设计。 2. 设置场景加载顺序:在Unity编辑器中,使用"Build Settings"面板来设置场景加载顺序。打开"Build Settings"面板后,选择需要加载场景,并按照顺序将它们添加到"Scenes In Build"列表中。确保需要加载场景在游戏开始时被加载。 3. 加载场景:在游戏开始时,使用Unity提供的API来加载加载场景。可以使用场景管理器(SceneManager)的LoadSceneAsync()方法来异步加载场景,从而避免游戏卡顿。加载场景时,可以指定要加载场景的名称或索引。 4. 切换场景:一旦场景加载完成,可以使用SceneManager.LoadScene()方法来切换到已经加载场景。这样就可以在不同的场景之间切换,实现更复杂的游戏逻辑。 加载多个场景可以提高游戏的性能和流畅度,因为场景加载时会消耗一定的时间和资源。通过加载多个场景,可以减少在游戏运行时切换场景时的加载时间,从而提高游戏的用户体验。 总之,Unity提供了强大的场景管理功能,通过加载多个场景可以提高游戏的性能和流畅度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千年奇葩

从来没受过打赏,这玩意好吃吗?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值