上海古都建筑设计集团,上海办公室装修设计公司,上海装修公司高质量的内容分享社区,上海装修公司我们不是内容生产者,我们只是上海办公室装修设计公司内容的搬运工平台

【Unity每日一记】资源加载相关你掌握多少?

guduadmin462月前

【Unity每日一记】资源加载相关你掌握多少?,在这里插入图片描述,第1张


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

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

👨‍💻 本文由 秩沅 原创

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

🅰️推荐文章


⭐【软件设计师高频考点暴击】

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

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

⭐【unity本站最全系列】unity常用API大全一篇文章足以

【Unity每日一记】资源加载相关你掌握多少?,在这里插入图片描述,第2张



文章目录

    • 🅰️推荐文章
    • 🎶Resources资源动态加载
        • 同步加载
        • 异步加载
        • 资源加载器
        • 卸载资源
        • 🅰️系统路线学习点击跳转

          🎶Resources资源动态加载


          【Unity每日一记】资源加载相关你掌握多少?,在这里插入图片描述,第3张

          同步加载

          5种资源加载的方式,Resource加载介绍


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

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



            关键字:@ ,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("Prefabs");
                    AudioClip[] audioClips= Resources.LoadAll("");
                    foreach (var item in audioClips)
                    {
                        Debug.Log(item);
                    }
                    //Resources.UnloadAsset
                }
            
            • C#中的回收机制是系统自动回收的,有多种回收机制,不像其他语言需要手动回收

              注意:

              //预设体对象加载需要实例化

              //其它资源加载一般直接用

              #endregion

              Resource资源加载操作


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

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

              • 根目录加载 Resource.Load< AudioClip>(“voice”);
              • 子目录加载 Resource.Load ( @ " 子目录名/ voice") ;
              • 另一种形式:

                Object xx = Resource.Load(“voice”);

                AudioClip yy as xx ; // 显性类型转换 ,前提是二者兼容

              • 加载同类型所有资源的方法:

                ①根目录加载: AudioClip [] xx = Resource.AllLoad(" “) ;

                ②子目录加载:AudioClip [] yy = Resource.AllLoad(” 子目录名");


                • 1.预设体对象
                          Object obj = Resources.Load("Cube");
                          Instantiate(obj);
                  
                  • 2.音效资源
                            Object obj3 = Resources.Load("Music/BKMusic");
                            //我们不需要实例化 音效切片 我们只需要把数据 赋值到正确的脚本上即可
                            audioS.clip = obj3 as AudioClip;
                            audioS.Play();
                    
                    • 3.文本资源

                      文本资源支持的格式——.txt .xml .bytes .json .html .csv …

                              TextAsset ta = Resources.Load("Txt/Test") as TextAsset;
                              //文本内容
                               ta.text
                              //字节数据组 
                               ta.bytes);
                      
                      • 4.图片
                                tex = Resources.Load("Tex/TestJPG") as Texture;
                        

                        异步加载

                        如果我们加载过大的资源可能会造成程序卡顿

                        异步加载 就是内部新开一个线程进行资源加载 不会造成主线程卡顿

                        • Resources.LoadAsync(“XXX”);
                        • 注意:

                          异步加载 不能马上得到加载的资源 至少要等待一帧

                          直接异步加载——适用于加载单个资源

                          //通过事件监听
                              ResourceRequest rq = Resources.LoadAsync("Tex/TestJPG")
                              rq.completed += LoadOver;
                              //completed 是 ResourceRequest 中的委托    
                              // AsyncOperation 是 ResourceRequest 的父类
                              private void LoadOver( AsyncOperation rq)
                              {
                                 //在事件中添加结束标识逻辑,这样我们就知道异步加载完成了
                                  print("加载结束");
                                  //加载完成后 会保存在 ResourceRequest类中的 asset Object类型成员里
                                  //此时实现赋值
                                  picture = (rq as ResourceRequest).asset as Texture;
                              }
                          

                          配套协程异步加载——适用于加载多个资源

                          //通过协程的调度器自己判断是否加载结束
                             
                              StartCoroutine(Load());
                              IEnumerator Load()
                              {
                                   ResourceRequest rq = Resources.LoadAsync("Tex/TestJPG");
                                   yield return rq;
                             // yield return rq会自己判断 该资源是否加载完毕了,加载完毕过后才继续执行后面的代码 ,因为ResourceRequest 也是YieldInstruction的子类
                             
                                 
                                  //-------------------------------
                                   //isDone 和 progress API的应用
                                  while(!rq.isDone)
                                  {
                                      //打印当前的 加载进度 
                                      print(rq.progress);
                                      yield return null;
                                  }
                                  //--------------------------------
                                  picture = rq.asset as Texture;
                              }
                          

                          资源加载器

                          利用异步直接加载和委托的使用构成简单的资源加载器

                          using System.Collections;
                          using System.Collections.Generic;
                          using UnityEngine;
                          using UnityEngine.Events;
                          //-------------------------------------
                          //—————————————————————————————————————
                          //___________项目:       ______________
                          //___________功能:  简单的资源管理器
                          //___________创建者:秩沅_______________
                          //_____________________________________
                          //-------------------------------------
                          public class ResourcesControl 
                          {
                              static  private ResourcesControl control;
                              static  public ResourcesControl Control => control;
                              private ResourcesControl()
                              {
                              }
                              public void AddResources(string name ,UnityAction source ) where T : Object
                              {
                                  ResourceRequest yb = Resources.LoadAsync(name);
                                  yb.completed += (reO) =>
                                  {
                                      source( (reO as ResourceRequest).asset as T );
                                  };
                              }
                          }
                          //外部调用
                          private void Start()
                          {
                             GameObject shootball; 
                                  ResourcesControl.Control.AddResources("Profabs/ball",(sphere)=> {
                                      shootball = sphere;
                                  } );
                           }
                          

                          卸载资源

                          【Unity每日一记】资源加载相关你掌握多少?,在这里插入图片描述,第4张

                          • Resources多次重复加载不会浪费内存

                            但是 会浪费性能(每次加载都会去查找取出,始终伴随一些性能消耗)

                          • 1.卸载指定资源

                            Resources.UnloadAsset 方法

                            注意:

                             它只能用于一些 不需要实例化的内容 比如 图片 和 音效 文本等
                             一般情况下很少单独使用它
                            
                          • 2.卸载未使用的资源

                            一般在过场景时和GC一起使用

                            Resources.UnloadUnusedAssets();

                            GC.Collect();


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


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

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

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

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

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

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

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


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


                            【Unity每日一记】资源加载相关你掌握多少?,在这里插入图片描述,第2张


网友评论

搜索
最新文章
热门文章
热门标签
 
 梦见猫是仙家托梦吗  财运测算2022年免费  周公解梦破解大全查询免费