Unity统一过渡加载界面

这篇具有很好参考价值的文章主要介绍了Unity统一过渡加载界面。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近在研究一些与游戏架构无关,却觉得相当重要的小功能,只有在需要用到的时候想到不如在用之前研究好,这篇文章是个人方法,因为网上实现加载界面的功能的方式很多,全文就当参考了。

前言

        我们在玩游戏时,经常会见到加载界面,或者说几乎没有没有加载界面的游戏。

下面这是堕落之主(我发现最近老是拿它说事)的加载界面,这已经算是比较普通的加载界面了,有一些还会提供游戏提示,背景介绍之类的游戏信息。对于玩家来说,加载界面是“喘息”和“思考”的间隙,而对于游戏工作者,加载界面有更多意义,比如提前异步加载场景避免让玩家看到一个虚空世界,或者别的什么处理。

总之就是向玩家提供信息和为加载提供时间。

Unity统一过渡加载界面,unity

 

        我们看到堕落之主的加载界面只有一个图案和一个进度条,这其实也是基本加载界面需要的,当然不可能所有游戏都一样。比如怪猎的加载界面就没有进度条,取而代之的是两个导虫转圈圈。所以只要让玩家看得出来是个加载界面就行了。

        这次的笔记将制作一个只有一个进度条和文本提示的加载界面。并且实现“按任意键继续”的功能。

简单加载界面

外观

        直接上图看看是什么样子的。

Unity统一过渡加载界面,unity

它的组件很简单,             

Unity统一过渡加载界面,unity

Progress(进度条) 下的fill和Text分别对应控制进度条填充和文本的改变。当然怎么做和命名不是重点,重要的是这些所有内容,或者说这整个加载界面是一个场景Scene。

我将LoadingPanel设置为预制体,并在上面添加一个脚本以实现其功能。

在进行脚本讲解前,我想先说明把整个加载界面独立成场景的想法:

1.方便管理。直接管理对应场景即可,简洁明了。

2.逻辑易实现。很多时候,比如以Panel作为加载界面时,是在当前场景加载到目标场景,也就是说还需要管理加载时当前场景的逻辑,避免BUG。但是先加载到一个统一的场景就可以不管上个场景的逻辑了,这个场景有且只有一个逻辑——加载界面。

脚本

        

using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
/// <summary>
/// 场景加载过渡场景。
/// </summary>
public class LoadPanel : Singleton<LoadPanel>
{
    private const string LoadingSceneName = "Loading";
    private static string TargetScene;//目标场景

    public GameObject fill;
    public GameObject text;
    private void Awake()
    {                
        StartCoroutine(LoadSceneAsync(TargetScene));
    }
    public static void LoadScene(string sceneName)
    {
        TargetScene = sceneName;
        SceneManager.LoadScene(LoadingSceneName,LoadSceneMode.Single);//优先加载Loading场景
    }

    IEnumerator LoadSceneAsync(string sceneName)
    {
        fill.GetComponent<Image>().fillAmount = 0f;

        yield return new WaitForSeconds(0.5f);//等待0.5s先,这很重要
        AsyncOperation operation = SceneManager.LoadSceneAsync(sceneName);
        operation.allowSceneActivation = false;
        
        while (!operation.isDone)
        {
            yield return null;
            if(operation.progress >= 0.9f)
            {
                text.GetComponent<Text>().text = "Press To Continue...";
                fill.GetComponent<Image>().fillAmount = 1f;
                if (Input.anyKeyDown)
                {
                    operation.allowSceneActivation = true;
                }
            }
            else
            {
                fill.GetComponent<Image>().fillAmount = operation.progress;                
            }
        }        
        
    }
}

那我从上到下详细说下这坨代码:

1.这个类继承自Singleton<T>,这是个单例母版类,而它继承自Monobehaviour,只需要将其视为写了一点单例模式的代码的Monobehaviour就行了。这个与正文没什么联系。

2.下面两行是做软编码和声明目标场景。LoadingSceneName是加载界面对应的那个场景,我这里是“Loading”。TargetScene就是接下来要加载的下一个场景。

3.下面两个共有声明是进度条对应的填充和文本。这里我是直接将搭载脚本的物体做成预制体,然后在预制体界面将他们两个赋值。当然其他赋值方式也行。

4.在周期函数Awake里直接进行协程的启动。传入TargetScene作为参数。详细看一下这个协程。首先第一句话就是改变填充量归零。这里我是用Image填充方式做进度条而不是Slider,具体可以看我之前的一篇UI制作相关的文章。

        然后就是异步加载的一般操作,存储操作,将操作允许场景激活设为false,因为我们要实现“按任意键继续”的功能。但是前面这个停留0.5秒很重要,因为如果没有等待,allowSceneActivation将会失效,场景会直接跳转不会停留。这个你等待哪怕一帧都是可以的。具体原因不太清楚,有清楚的请请请告诉我。

        接下来的While中编写了进度同步和功能逻辑。我相信这个逻辑很简单,大家都应该看得懂,那我就说一下为什么要以0.9作为分界点,因为当allowSceneActivation=false时,加载进度只会加载到0.9(0~1)时就会停下,剩下0.1只会在allowSceneActivation=true时加载。所以为了美观,我们在进度加载到0.9时将填充量设为1,即进度条填充满。不然它会剩一小段空的。没到0.9就保持加载进度和填充量一致就好了。

5.最后我们来看静态方法LoadScene,它先是将参数传赋值给目标场景,再用一般方式加载加载界面场景。简单来讲就是,我先把这个脚本的目标场景设置为我想要加载的场景,然后固定地先加载到加载界面这个场景,最后通过那个协程实现加载逻辑。这就是为什么TargetScene要设置为静态的,这是为了确保加载场景不存在时,你可以提前为TargetScene赋值,而在加载场景加载出来后,Awake将直接调用协程从而加载你想要的那个场景,你可以把整个流程视为转乘航班。因为加载场景体量很小,所以不需要异步加载(不会真有人在加载界面放一大堆东西吧?!)。

        这样一来,在其他脚本中,一旦你想加载某个场景,只需要直接调用静态方法LoadScene即可,传入你想加载的那个场景作为参数。这里是名字,当然你想用编号之类的也行。

using UnityEngine;

public class Menu : MonoBehaviour
{
    private const string BattleScene = "Battle";
    
    public void NewGame()
    {
        LoadPanel.LoadScene(BattleScene);
    }
}

这里是一个叫做Menu的脚本,想也知道它是干什么的,NewGame已经与按钮事件绑定,里面只有一句话。就是调用静态方法LoadScene,传入了一个叫做Battle的场景名称。

效果

        Unity统一过渡加载界面,unity

可以看见点击按钮后,显示加载到了加载界面场景,然后从加载界面场景再加载到目标场景。     

这样一来我们就实现了统一加载界面功能,以后需要加载场景只用一个方法即可。如果你想要不同的加载方式可以试试修改,这样仅当参考。  

结语

        这样的场景加载方式是相当较为简单的,所以它也是有很多弊端的,比如加载较小的场景时,如果每个小场景都需要这样跳转等待,那么未免会让人烦躁,最好的是多写几种不同的场景加载方式,让玩家在玩游戏时不至于因加载太多而烦恼。

        这个笔记仅提供思路,希望能有所帮助。文章来源地址https://www.toymoban.com/news/detail-766586.html

到了这里,关于Unity统一过渡加载界面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Unity学习笔记(一)Unity的界面和操作

    Unity官方教程 :Unity User Manual 2021.3 (LTS) - Unity 手册 UnityLearn :Learn Game Development Without Coding Experience | Unity 如何导入一个Asset Store的包? 以安装 Playground 为例。 (1)获取:从Asset StoreUnity Playground | 视频教程项目资源 | Unity Asset Store (2)导入:在 Asset Store (unity.com) 商店中选择

    2023年04月08日
    浏览(44)
  • 【Unity技巧】跳过Unity启动屏/Logo/加载页

    Unity启动Logo让人非常不爽,因为展示unity logo非常拖沓, 延缓了打开游戏的时间 翻了一下Unity API文档,Unity居然真的有SplashScreen.Stop() 停止启动屏的API 只需要写个静态方法,使用[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)] 即在在显示启动画面之前调用这个静态方

    2024年02月08日
    浏览(35)
  • Unity问题——Unity 崩溃时如何找回未保存编辑界面

    声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改。 Unity 无限制 VS 无限制 1.正常编辑时Unity 突然崩了 2.使用时突然断电关机等. 当你在Unity中编辑场景,突然死机. 在项目文件目录中找到Temp文件夹,双击文件夹

    2024年02月04日
    浏览(38)
  • 【Unity细节】Unity中为什么用字符串加载对象,检查多便都加载不出来—(命名细节)

    👨‍💻个人主页 :@元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏 :unity细节和bug 😶‍🌫️优质专栏 ⭐【软件设计师高频考点暴击】 明明名字对上了,类型也对上了,为什么还是加载不出来 命名时,多添加了空格 把空

    2024年02月05日
    浏览(65)
  • 【Unity】 Unity PackageManager通过git url 加载插件失败问题

    我在测试dolby 的unity demo 的时候,遇到加载package 失败的问题。 [Package Manager Window] Cannot perform upm operation: Unable to add package [https://github.com/focus-creative-games/hybridclr_unity.git]: 网上查解决办法, 使用下面的改变系统环境变量还是没有效果。 Unity 通过url 下载插件失败 最后尝试自己

    2024年04月15日
    浏览(38)
  • 【Unity细节】为什么加载精灵图集直接导致Unity引擎崩溃

    👨‍💻个人主页 :@元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏 :unity细节和bug 😶‍🌫️优质专栏 ⭐【软件设计师高频考点暴击】 点击运行,Unity直接崩溃退出 在加载打包后的图集时,可能图集里面没有相应的资源,

    2024年02月05日
    浏览(61)
  • Unity基础 异步加载场景

    异步加载场景的基本概念 在Unity中,异步加载场景是指在游戏运行时,将场景中的资源分批次加载到内存中,以便提高游戏的加载速度和性能。通常情况下,加载场景的过程会在主线程中执行,而异步加载场景可以在后台线程中执行,从而不会阻塞主线程。 要使用异步加载首

    2024年02月12日
    浏览(46)
  • Unity实现异步加载场景

    一:创建UGUI 首先我们在LoginCanvas登入面板下面创建一个Panel,取名为LoadScreen,再在loadScreen下面创建一个Image组件,放置背景图片,然后我们再在lpadScreen下面继续创建一个Slider,这个是用来加载进度条的,我们改名为LoadSlider。我们为什么需要改名字,为了见名之一,不至于过段时

    2024年02月12日
    浏览(38)
  • Unity中资源异步加载

            Unity作为一款优秀的游戏引擎,广泛应用于游戏制作领域。在游戏的开发过程中,资源加载的效率和流畅度尤为重要。对于较大的资源文件,同步加载方式可能会导致游戏卡顿、延迟等问题。因此,采用异步加载的方法可以提高游戏的效率和用户体验。 本篇博客将

    2024年02月06日
    浏览(58)
  • Unity资源加载方式

    Resources:逻辑资源目录,这个目录中的资源会 打入到包 中, 不允许热更 。在打包时会被压缩和加密。 加载方式:Resources.Load(常用) 、 AssetDatabase.LoadAssetAtPath等加载接口 StreamingAssets:Raw资源目录,这个目录中的资源也会 打入到包 中,且允许程序通过Application.streamingAsse

    2023年04月09日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包