当前位置:   article > 正文

Unity资源加载方式示例_resources.load

resources.load

        但凡学习unity的小伙伴,都难免要跟unity的资源打交道,但是过段时间不用就容易忘记,我也是,因此特地整理一下经常用的资源加载的方式,已供大家跟自己在以后查阅。

方式1:Resources.Load

这也是很常用的一种方式,不管是在运行期,还是在编辑器下,都是可以使用的。unity官方给了下面几种示例:

  1. // Load assets from the Resources folder. Ignore other named and typed assets.
  2. using UnityEngine;
  3. public class ExampleClass : MonoBehaviour
  4. {
  5. void Start()
  6. {
  7. //Load a text file (Assets/Resources/Text/textFile01.txt)
  8. var textFile = Resources.Load<TextAsset>("Text/textFile01");
  9. //Load text from a JSON file (Assets/Resources/Text/jsonFile01.json)
  10. var jsonTextFile = Resources.Load<TextAsset>("Text/jsonFile01");
  11. //Then use JsonUtility.FromJson<T>() to deserialize jsonTextFile into an object
  12. //Load a Texture (Assets/Resources/Textures/texture01.png)
  13. var texture = Resources.Load<Texture2D>("Textures/texture01");
  14. //Load a Sprite (Assets/Resources/Sprites/sprite01.png)
  15. var sprite = Resources.Load<Sprite>("Sprites/sprite01");
  16. //Load an AudioClip (Assets/Resources/Audio/audioClip01.mp3)
  17. var audioClip = Resources.Load<AudioClip>("Audio/audioClip01");
  18. }
  19. }

 

特点:

  • 资源必须在Resources目录下,访问时,路径相对于Resources,且不带后缀

        

  • 只读,如果需要对其进行更改,就不要放这里
  • 如果能找到路径,切继承自object则返回,否则返回空
  • 会将文件夹内的资源打包集成到.asset文件里面。因此建议可以放一些Prefab,因为Prefab在打包时会自动过滤掉不需要的资源,有利于减小资源包的大小。

示例:

先创建一个预设,步骤如下:

1.先随意创建一个spere,然后创建一个预设,放到Resources/Prefab下:

2.然后创建一个material,并给material一个材质,并且赋给上面的prefab:

3.然后创建一个脚本,叫ResourcesManager,并挂在Main Camera下:

4.在脚本中加入测试代码:

  1. using UnityEngine;
  2. namespace Game.Framework
  3. {
  4. public class ResourcesManager : MonoBehaviour
  5. {
  6. private GameObject gameObject;
  7. private void Awake()
  8. {
  9. GameObject prefab = Resources.Load<GameObject>("Prefab/Sphere");
  10. gameObject = Instantiate(prefab);
  11. }
  12. private void Update()
  13. {
  14. gameObject.transform.Translate(Vector3.right * Time.deltaTime);
  15. UnityEngine.Debug.LogFormat("gameObject pos : {0}", gameObject.transform.position);
  16. }
  17. }
  18. }

5.运行,发现出现了一个新创建的球,在场景中运动。

 

方式2:Streaming Assets

        有时候我们需要不打包资源,运行个各个平台时,有时候需要访问原文件,unity会把我们Assets/StreamingAssets 下的文件原模原样的复制到目标机器。如常见的mp4文件。

特点:

  • 只读
  • 文件必须在StreamingAssets下
  • 不同的平台访问路径不一样:
    1. string path =
    2. #if UNITY_ANDROID && !UNITY_EDITOR
    3. Application.streamingAssetsPath + "/Json/GameConfig.json";
    4. #elif UNITY_IPHONE && !UNITY_EDITOR
    5. "file://" + Application.streamingAssetsPath + "/Json/GameConfig.json";
    6. #elif UNITY_STANDLONE_WIN || UNITY_EDITOR
    7. "file://" + Application.streamingAssetsPath + "/Json/GameConfig.json";
    8. #else
    9. string.Empty;
    10. #endif

     

  •  IOS和Android只能用WWW下载,
  • 在PC下,可以用File类API(如File.ReadAllText)读写StreamingAssets文件夹中的文件;在IOS和Android平台下,不能用File类API读取,也不能用File类判断存在不存在此目录下的文件。

示例:

1.新建一个json文件如下,内容随便加点什么:

2.在脚本中加入以下代码:

  1. using UnityEngine;
  2. namespace Game.Framework
  3. {
  4. public class ResourcesManager : MonoBehaviour
  5. {
  6. private void Awake()
  7. {
  8. string path =
  9. #if UNITY_ANDROID && !UNITY_EDITOR
  10. Application.streamingAssetsPath + "/Json/GameConfig.json";
  11. #elif UNITY_IPHONE && !UNITY_EDITOR
  12. "file://" + Application.streamingAssetsPath + "/Json/GameConfig.json";
  13. #elif UNITY_STANDLONE_WIN || UNITY_EDITOR
  14. "file://" + Application.streamingAssetsPath + "/Json/GameConfig.json";
  15. #else
  16. string.Empty;
  17. #endif
  18. StartCoroutine(ReadData(path));
  19. }
  20. IEnumerator ReadData(string path)
  21. {
  22. WWW www = new WWW(path);
  23. yield return www;
  24. while (www.isDone == false)
  25. {
  26. yield return new WaitForEndOfFrame();
  27. }
  28. yield return new WaitForSeconds(0.5f);
  29. string data = www.text;
  30. UnityEngine.Debug.Log(data);
  31. yield return new WaitForEndOfFrame();
  32. }
  33. }
  34. }

3.运行时,查看console输出data的数据:

 

方式3:AssetBundle

        现在基本每个游戏都有用到这种方式,原因主要是要热更新,主要包括一些图片,预设,模型,场景等。

特点:

  • 可以热更新
  • 在对不同的平台进行打包的时候,需要设定打包目标平台,即参数:BuildTarget,打完包之后的数据不同平台之间不能通用.
  • 加载方式有很多,之后会出一个专门的ab使用博客

示例:

1.先将方式一种的prefab进行ab标记

2.新建一个编辑器功能脚本AssetBundleBuilder,放到Editor目录下:

3.AssetBundleBuilder中写入如下代码:

  1. using UnityEditor;
  2. using UnityEngine;
  3. public class AssetBundleBuilder : Editor
  4. {
  5. [MenuItem("Custom Editor/Build AssetBundles")]
  6. static void BuildAsset()
  7. {
  8. BuildPipeline.BuildAssetBundles("Assets/StreamingAssets", BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
  9. }
  10. }

4.然后在unity中点击如下按钮:

5.等打包完,然后会在我们制定的目录Assets/StreamingAssets下生成对应的ab文件:

6.最后在代码中写入如下代码,测试是否能够正确加载:

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using UnityEngine;
  8. namespace Game.Framework
  9. {
  10. public class ResourcesManager : MonoBehaviour
  11. {
  12. private void Awake()
  13. {
  14. string path = Application.streamingAssetsPath + "/";
  15. AssetBundle assetbundle = AssetBundle.LoadFromFile(path + "prefab.sphere");
  16. GameObject Prefab = assetbundle.LoadAsset<GameObject>("Sphere");
  17. if (Prefab != null)
  18. {
  19. UnityEngine.Debug.Log("success");
  20. }
  21. else
  22. {
  23. UnityEngine.Debug.Log("fail");
  24. }
  25. }
  26. }
  27. }

7.当我们运行的时候发现:

说明我们已经正确的读取了ab的资源了。

 

方式4:AssetDatabase

        如果对任意目录希望可以访问资源,我们可以使用AssetDatabase

特点:

  • 所有的路径都是相对于工程目录文件,需要包含后缀
  • 可以增删改查
  • 参数assetPaht不需要区分大小写。在Unity中所有的资源名称和路径都需要斜杠/

示例:

  1. using UnityEngine;
  2. using UnityEditor;
  3. public class MyPlayer : MonoBehaviour
  4. {
  5. [MenuItem("AssetDatabase/LoadAssetExample")]
  6. static void ImportExample()
  7. {
  8. Texture2D t = (Texture2D)AssetDatabase.LoadAssetAtPath("Assets/Textures/texture.jpg", typeof(Texture2D));
  9. }
  10. }

加载方法:AssetDatabase.LoadAssetAtPath(string assetPath, Type type);

怎么测试,上面已经讲了很多了,有兴趣的读者试一下就知道了。

 

码字完毕,哈哈,很简单的东西,但是经常用到,这里简单的记录一下,以供自己以后使用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/566281
推荐阅读
相关标签
  

闽ICP备14008679号