unity资源加载

unity资源加载

打包的资源

  • Android
    所有资源打包在 unityLibrary\src\main\assets\bin\Data\data.unity3d
    • 场景存放在 level[n]
    • 共享资源存放在 sharedassets[n].asset
    • Resources文件夹下的资源存放在 resources.asset
  • iOS
    • 场景存放在 Data\level[n]
    • 共享资源存放在 sharedassets[0].asset
    • Resources文件夹下的资源存放在 resources.asset

Resources.Load

  • 参考 Unity User Manual (2019.4 LTS)/Working in Unity/资源工作流程/Scripting with Assets/在运行时加载资源

  • 目的
    在游戏运行时根据需要动态加载资源,注意资源还是在安装包中

  • 原理
    根据creator推测其原理是unity内部对每个资源分配uid,打包时是用uid替换文件路径,
    如果文件在Resources下则会把uid和原始文件路径的映射关系保存在一个配置文件中,
    加载时先把路径映射成uid,再用uid加载文件

  • 资源配置
    在Project下的任意文件夹中创建的Resources文件夹,其下的文件如果被场景引用,将打包进sharedassets[level].assets
    否则所有Resources文件夹下的资源将被打包成resources.assets,
    因此不同目录下的Resources文件夹下的资源最好有不同的路径,以免冲突

  • 资源加载
    在运行时用Resources.Load动态加载,要用相对Resources的路径,且不带扩展名
    如:Assets/Resources/a/glass.png或Assets/MyResource/Resources/a/glass.png
    在运行时都是用Resources.Load(“a/glass”,typeof(Texture2D) as Texture2D来加载

  • 资源卸载
    Resources.UnloadAsset不会卸载资源,要用UnloadUnusedAssets

  • 查找脚本
    Resources.FindObjectsOfTypeAll

Streaming Assets

  • 目的
    直接使用原始文件,比如视频文件,有些播放器需要直接使用文件路径去访问

  • 原理
    位于 StreamingAssets 目录下的文件将不进行打包操作,以原始文件路径直接存储

  • 资源配置
    在Assets目录下建一目录StreamingAssets,把资源放到该目录下

  • 资源加载
    目标机器的StreamingAssets目录 Application.streamingAssetsPath 跟平台有关:

    • Editor 或 win Application.streamingAssetsPath = Application.dataPath + “/StreamingAssets”;
    • ios 平台 Application.streamingAssetsPath = Application.dataPath + “/Raw”
    • android 平台 Application.streamingAssetsPath = “jar:file://” + Application.dataPath + “!/assets”
      存储在压缩文件中,必须使用 UnityWebRequest 加载文件
    • webGL 平台没有权限访问
    • 其它平台直接使用:
          GameObject cam = GameObject.Find("Main Camera");
          videoPlayer = cam.AddComponent<UnityEngine.Video.VideoPlayer>();
          // Obtain the location of the video clip.
          videoPlayer.url = Path.Combine(Application.streamingAssetsPath, "SampleVideo_1280x720_5mb.mp4");
      

AssetBundle

  • 参考 Unity User Manual (2019.4 LTS)/Working in Unity/资源工作流程/AssetBundle

  • 目的
    把一些资源打包成一个文件,可以从外部进行加载,外部可以通过从网络下载的方式来实现更新

  • 资源配置
    参考 Unity User Manual (2019.4 LTS)/Working in Unity/资源工作流程/AssetBundle/AssetBundle 工作流程
    5.x版本对生成assetBundle进行一定的支持,在每个资源的属性窗口右下角 AssetBundle 栏有2个选项

    • 左边选择该资源所属分组(也就是包名),支持目录结构用"/"
    • 右边选择变体名称(也就是包的后缀名,不能是预留的txt rar等,需要才加不需要留空)
      包名和后缀名相同的资源会打在同一个包里,
    • 注意相同包名的要么都有后缀,要么都没有后缀,不能同时存在 aaa 和 aaa.abb
    • 注意如果文件夹设置包名,该文件夹下没设置包名的资源将被打进文件夹所在包名
  • 资源打包
    参考 Unity User Manual (2019.4 LTS)/Working in Unity/资源工作流程/AssetBundle/构建 AssetBundle

    • 资源分组后可以执行下面脚本将各资源分组打包并放入目标目录,目标目录是以工程路径(Assets的上一层)为相对目录

      	//	将这段代码放到  Assets/Editor/XXX.cs 中
      	//	通过 菜单Assets->Build AssetBundles 执行
      	[MenuItem("Assets/Build AssetBundles")]
      	static void BuildAllAssetBundles()
      	{
             
             
      		//	打包输出目录
      		string assetBundleDirectory = "Assets/AssetBundleOut";
      		if (!Directory.Exists(assetBundleDirectory))
      		
Unity资源加载模块主要有同步加载和异步加载两种方式。 ### 同步加载 同步加载是指在加载资源时,程序会暂停执行,直到资源加载完成。这种方式简单直接,但可能会导致程序在加载资源时出现卡顿。在引用[1]中给出了同步加载资源的代码实现,在`ResManager`类里定义了同步加载资源的方法`Load<T>`,其代码如下: ```csharp public T Load<T>(string resName) where T : Object { T resObj = Resources.Load<T>(resName); if (resObj is GameObject) return GameObject.Instantiate(resObj); else return resObj; } ``` 该方法接收资源名称`resName`作为参数,使用`Resources.Load<T>`方法加载资源。如果加载资源是`GameObject`类型,则会实例化该对象;否则直接返回资源对象。引用[2]给出了同步加载的简单应用案例,在`SyncLoadExample`类的`Start`方法中同步加载名为`MyPrefab`的资源并实例化: ```csharp public class SyncLoadExample : MonoBehaviour { void Start() { // 同步加载资源 GameObject obj = Resources.Load<GameObject>("MyPrefab"); if (obj != null) { Instantiate(obj, Vector3.zero, Quaternion.identity); } else { Debug.LogError("加载资源失败."); } } } ``` ### 异步加载 异步加载是指在加载资源时,程序不会等待资源加载完成,而是继续执行后续代码,当资源加载完成后会触发相应的回调函数。这种方式可以避免程序卡顿,提高用户体验。在引用[1]中,`ResManager`类实现了异步加载的功能,定义了`LoadAysnc<T>`方法用于开启异步加载的协程,以及`LoadAsyncCor<T>`这个真正的协同程序函数用于开启异步加载对应的资源。代码如下: ```csharp //异步加载资源 public void LoadAysnc<T>(string resName, UnityAction<T> callback) where T : Object { //开启异步加载的协程 MonoMgr.GetInstance().StartCoroutine(LoadAsyncCor(resName, callback)); } //真正的协同程序函数 用于 开启异步加载对应的资源 public IEnumerator LoadAsyncCor<T>(string resName, UnityAction<T> callback) where T : Object { ResourceRequest R = Resources.LoadAsync<T>(resName); yield return R; if (R.asset is GameObject) callback(GameObject.Instantiate(R.asset) as T); else callback(R.asset as T); } ``` `LoadAysnc<T>`方法接收资源名称`resName`和回调函数`callback`作为参数,调用`MonoMgr`类的实例开启异步加载的协程。`LoadAsyncCor<T>`方法使用`Resources.LoadAsync<T>`方法异步加载资源,当资源加载完成后,根据资源类型进行实例化并调用回调函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值