文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Unity3d热更新(二):资源打包As

2023-01-31 02:54

关注

创建AssetBundle

1.新建一个cube,将其拉倒Project视图里创建预设。

2.在Assets目录下创建Scenes文件夹,创建场景scene1.unity。

3.新建ExportAssetBundles.cs,保存在Assets/Editor目录下。代码如下:


[csharp] view plaincopy在CODE上查看代码片派生到我的代码片

  1. <span style="font-family:Microsoft YaHei;">using UnityEngine;  

  2. using UnityEditor;  

  3. using System.Collections;  

  4. public class ExportAssetBundles : MonoBehaviour {  

  5.     [MenuItem("Build/ExportResource")]  

  6.     static void ExportResource()  

  7.     {  

  8.         // 打开保存面板,获取用户选择的路径  

  9.         string path = EditorUtility.SaveFilePanel("Save Resource", "", "New Resource", "assetbundle");  

  10.         if (path.Length != 0)  

  11.         {  

  12.             // 选择的要保存的对象  

  13.             Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);  

  14.             // 打包  

  15.             BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets, BuildTarget.StandaloneWindows);  

  16.         }  

  17.     }  

  18.     [MenuItem("Build/ExportScene")]  

  19.     static void ExportScene()  

  20.     {  

  21.         // 打开面板,选择用户保存的路径  

  22.         string path = EditorUtility.SaveFilePanel("Save Resource", "", "New Resource", "unity3d");  

  23.         if (path.Length != 0)  

  24.         {  

  25.             // 要打包的场景  

  26.             string[] scenes = {"Assets/Scenes/scene1.unity"};  

  27.             // 打包  

  28.             BuildPipeline.BuildPlayer(scenes, path, BuildTarget.StandaloneWindows, BuildOptions.BuildAdditionalStreamedScenes);  

  29.         }  

  30.     }  

  31. }</span>  


4.选中预设,运行ExportResource,弹出保存对话框,命名为cube.assetbundle。

5.运行ExportScene,弹出保存对话框,命名为scene1.unity3d。

小提示

1.AssetBundle的保存后缀名可以是assetbundle或者unity3d。

2.BuildAssetBundle要根据不同的平台单独打包,BuildTarget参数指定平台,如果不指定,默认的webplayer。

加载AssetBundle

下面通过一个示例演示如何加载AssetBundle:

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片

  1. <span style="font-family:Microsoft YaHei;">using UnityEngine;  

  2. using System.Collections;  

  3. public class Load : MonoBehaviour {  

  4.     private string BundleUrl = "file:///C:/Users/Administrator/Desktop/Res/cube.assetbundle";  

  5.     private string SceneUrl = "file:///C:/Users/Administrator/Desktop/Res/scene1.unity3d";  

  6.     void Start()  

  7.     {  

  8.         StartCoroutine(Download());  

  9.     }  

  10.     IEnumerator Download()  

  11.     {  

  12.         // 下载AssetBundle,加载cube  

  13.         using(WWW www = new WWW(BundleUrl))  

  14.         {  

  15.             yield return www;  

  16.             AssetBundle bundle = www.assetBundle;  

  17.             Instantiate(bundle.Load("Cube"));  

  18.             bundle.Unload(false);  

  19.             yield return new WaitForSeconds(5);  

  20.         }  

  21.         using(WWW www = new WWW(SceneUrl))  

  22.         {  

  23.             yield return www;  

  24.             Application.LoadLevel("scene1");  

  25.         }  

  26.     }  

  27. }</span>  


我们在程序加载的时候必须保证先加载公共对象。否则,只能是在各个对象加载成功后,再通过程序手动添加进来,比较繁琐。在实际项目中,由于是团队开发,对象间的依赖关系通常会比较凌乱,最好在开发周期就定好相关的规范约束,方便管理。


AssetBundle依赖关系


如果一个公共对象被多个对象依赖,我们打包的时候,可以有两种选取。一种是比较省事的,就是将这个公共对象打包到每个对象中。这样会有很多弊端:内存被浪费了;加入公共对象改变了,每个依赖对象都得重新打包。AssetBundle提供了依赖关系打包。

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片

  1. <span style="font-family:Microsoft YaHei;">    //启用交叉引用,用于所有跟随的资源包文件,直到我们调用PopAssetDependencies    

  2.     BuildPipeline.PushAssetDependencies();    

  3.     

  4.     var options =    

  5.         BuildAssetBundleOptions.CollectDependencies |    

  6.         BuildAssetBundleOptions.CompleteAssets;    

  7.     

  8.     

  9.     //所有后续资源将共享这一资源包中的内容,由你来确保共享的资源包是否在其他资源载入之前载入    

  10.     BuildPipeline.BuildAssetBundle(    

  11.         AssetDatabase.LoadMainAssetAtPath("assets/artwork/lerpzuv.tif"),    

  12.         null, "Shared.unity3d", options);    

  13.     

  14.     

  15.     //这个文件将共享这些资源,但是后续的资源包将无法继续共享它    

  16.     BuildPipeline.PushAssetDependencies();    

  17.     BuildPipeline.BuildAssetBundle(    

  18.         AssetDatabase.LoadMainAssetAtPath("Assets/Artwork/Lerpz.fbx"),    

  19.         null, "Lerpz.unity3d", options);    

  20.     BuildPipeline.PopAssetDependencies();  

  21.     

  22.     

  23.     //这个文件将共享这些资源,但是后续的资源包将无法继续共享它    

  24.     BuildPipeline.PushAssetDependencies();    

  25.     BuildPipeline.BuildAssetBundle(    

  26.         AssetDatabase.LoadMainAssetAtPath("Assets/Artwork/explosive guitex.prefab"),    

  27.         null, "explosive.unity3d", options);    

  28.     BuildPipeline.PopAssetDependencies();    

  29.     

  30.     

  31.     BuildPipeline.PopAssetDependencies();  </span>  


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯