【unity每日一记】资源和场景加载图文详解

举报
Mango易创 发表于 2023/06/26 10:53:35 2023/06/26
【摘要】 👨‍💻个人主页:@元宇宙-秩沅👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!👨‍💻 本文由 秩沅 原创👨‍💻 收录于专栏:unity每日一记 ⭐🅰️推荐文章⭐⭐【Unityc#专题篇】之c#系统化大礼包】⭐【unity数据持久化】数据管理类_PlayerPrfs⭐【unity本站最全系列】unity常用API大全一篇文章足以 ⭐Unity中资源和场景加载⭐...

在这里插入图片描述


👨‍💻个人主页@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏unity每日一记

🅰️推荐文章


【Unityc#专题篇】之c#系统化大礼包】

【unity数据持久化】数据管理类_PlayerPrfs

【unity本站最全系列】unity常用API大全一篇文章足以
在这里插入图片描述


Unity中资源和场景加载


@[TOC]



🎶(==A==) 资源加载(Resource)


👨‍💻👍5种资源加载的方式,Resource加载介绍


  • Resources(只能加载Resources目录中的资源)
  • AssetBundle(只能加载AB资源,当前设备允许访问的路径都可以)
  • WWW(可以加载任意处资源,包括项目外资源(如远程服务器))
  • AssetDatabase(只能加载Assets目录下的资源,但只能用于Editor)
  • UnityWebRequest(可以加载任意处资源,是WWW的升级版本)

==资源加载适用于需要加载资源较多的 情况就不用一个一个的拖拽进去==


👨‍💻👍Resource资源加载操作


加载资源前首先需要在project面板中创建Resource名字的文件夹,为固定文件夹用于资源加载

==以加载AudioClip类型的资源为例:==

  • 根目录加载 Resource.Load< AudioClip>(“voice”);
  • 子目录加载 Resource.Load<AudioClip> ( @ " 子目录名/ voice") ;
  • 另一种形式:
    Object xx = Resource.Load(“voice”);
    AudioClip yy as xx ; // 显性类型转换 ,前提是二者兼容
  • 加载同类型所有资源的方法:
    ①根目录加载: AudioClip [] xx = Resource.AllLoad<AudioClip>(" “) ;
    ②子目录加载:AudioClip [] yy = Resource.AllLoad<AusioClip>(” 子目录名");

关键字:@ ,as

  • 卸载AB包的方法: Resource. UnLoadAsset
void Start()
    {

        Object obj= Resources.Load("sound");
        //AudioClip ac = obj as AudioClip;
        AudioClip ac = (AudioClip)obj;
        AudioSource.PlayClipAtPoint(ac, transform.position);
        
        //Resources.LoadAll<AudioClip>("Prefabs");
        AudioClip[] audioClips= Resources.LoadAll<AudioClip>("");
        foreach (var item in audioClips)
        {
            Debug.Log(item);
        }

        //Resources.UnloadAsset
    }
  • C#中的回收机制是系统自动回收的,有多种回收机制,不像其他语言需要手动回收

🎶(==B==) 场景(Scene)加载


👨‍💻👍加载场景的方法


  • SceneManager.LoadScene() ; 场景同步加载
  • SceneManager.LoadSceneSAsyn(); 场景异步加载
  • Application.LoadLevel():同步加载
  • Application.LoadLevelAsync():异步加载
  • Application.LoadLevelAddictive():同步附加式加载
  • Application.LoadLevelAddictiveAsync():异步附加式加载

👨‍💻👍SceneManasger的操作


首先添加场景加载的命名空间==Using UnityEngine.SceneManagement ;==
而后把游戏场景都保存(拖拽)在 Buid setting 里面,相当于存储场景的目录

在这里插入图片描述


👍1.同步加载


SceneManager.Load( 序列号) ;
SceneManager.Load( “场景名”) ;

 void Start()
    {
        //SceneManager.LoadScene(1);
        //SceneManager.LoadScene("TriggerTest");
    }


缺点:加载时造成画面卡帧,原因为,在未加载完成前画面是停止的,所以是卡帧现象


👍2.异步加载


异步加载与协程配套使用,协程也属于异步加载中的一部分
【 优点:不影响主进程的加载】

SceneManager.LoadAsync(序列号)
SceneManager.LoadAsync(“场景名”)

==但是通常我们和协程一起使用:==

StartCoroutine(协程迭代器方法() ); //调用协程

==AsyncOperation== 解析:、

  • AsyncOperation 该类型翻译为异步操作 ,为下面获得异步场景的返回值
    AsyncOperation ao= SceneManager.LoadSceneAsync(2);

  • ao.allowSceneActivation = true 激活场景

  • ao.progress 场景加载的进度


    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space)) //按下空格调用协程
        {
            StartCoroutine(LoadNextAsyncScene());
        }
        
        if (Input.anyKeyDown&&ao.progress>=0.9f) //当场景进程加载超过百分之90 激活场景
        {
            ao.allowSceneActivation = true;
        }
    }

    IEnumerator LoadNextAsyncScene()
    {
        AsyncOperation  ao= SceneManager.LoadSceneAsync(2);
        ao.allowSceneActivation = false;
        while (ao.progress<0.9f)
        {
            //当前场景加载进度小于0.9
            //当前场景挂起,一直加载,直到加载基本完成
            yield return null;
        }
        Debug.Log("按下任意键继续游戏");
    }

🅰️系统路线学习点击跳转


【Unityc#专题篇】之c#进阶篇】

【Unityc#专题篇】之c#核心篇】

【Unityc#专题篇】之c#基础篇】

【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】—进阶章题单实践练习

【Unityc#专题篇】—基础章题单实践练习

【Unityc#专题篇】—核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。