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))
      		{
             
      			Directory.CreateDirectory
### Unity 中的资源加载机制 在 Unity 中,资源加载过程主要包括五个阶段:资源定位、资源读取、资源解析、资源实例化以及资源卸载[^1]。 #### 资源定位 Unity 需要先确定所需资源的位置。这些资源通常位于项目的 `Assets` 文件夹内或是被打包成 AssetBundle 存储于本地或其他服务器上。对于内置资源管理器来说,只需提供相对路径即可完成定位;而对于 AssetBundle,则需指定确切 URL 或者文件名来获取特定 bundle。 #### 资源读取 一旦找到了目标资源的确切位置,下一步就是实际去读取该资源的数据。如果资源存在于硬盘驱动器中,则直接从磁盘读取;如果是通过网络分发的 AssetBundle,则还需要执行下载操作并可能对其进行解压处理。此过程中可能会遇到 I/O 性能瓶颈,因此建议优化访问模式以提高效率。 #### 资源解析 读入后的原始字节流需要被解释为具体的对象类型(比如材质球、模型网格)。这个转换工作由引擎内部自动完成,开发者无需关心具体细节。不过值得注意的是,在某些情况下手动控制序列化进程能够带来更好的灵活性和性能表现。 #### 资源实例化 经过上述几个步骤之后得到的对象只是处于未激活状态下的模板形式。为了能够在运行时环境中正常使用它们,必须调用相应 API 创建其活动副本。例如: ```csharp // 加载一个纹理资源 Texture2D texture; texture = Resources.Load<Texture2D>("Textures/MyTexture"); // 加载一个网格资源 Mesh mesh; mesh = Resources.Load<Mesh>("Models/MyMesh"); ``` 这段代码展示了如何利用 `Resources.Load<T>()` 方法快速简便地取得所需的图形资产,并将其赋值给变量以便后续使用。 #### 资源卸载 最后一步也是非常重要的一环——适时清理不再使用的资源有助于维持较低水平的应用程序占用率。可以通过 UnloadUnusedAssets 函数触发一次全局范围内的垃圾回收动作,从而清除那些已经失去引用关系的对象所占据的空间。 --- 除了掌握基本概念外,遵循一些最佳实践原则同样重要。减少 GameObject 数量及其上的组件数目可以有效降低渲染负担;预先计算复杂逻辑并将结果缓存起来供重复查询可节省大量 CPU 时间;合理规划依赖项规模避免不必要的传输成本等等都是值得考虑的方向[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值