Unity3d游戏开发中的AssetsBundle思路与方法运用.docx_第1页
Unity3d游戏开发中的AssetsBundle思路与方法运用.docx_第2页
Unity3d游戏开发中的AssetsBundle思路与方法运用.docx_第3页
Unity3d游戏开发中的AssetsBundle思路与方法运用.docx_第4页
Unity3d游戏开发中的AssetsBundle思路与方法运用.docx_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

想要认识Unity3d游戏开发中的AssetsBundle,我们需要先理解几个概念。二进制文件: AssetsBundle可以将二进制文件直接封装在里面。比如图片和声音和文本信息等。prefab : prefab可以封装成AssetsBundle。prefab身上含有游戏对象里的物体材质,游戏脚本,组件,动画资源,贴图,等游戏所需要的东西,都封装在一起。当从服务器上将Assetsbundle下载以后直接实例化就可以放入游戏中。这是非常方便的。场景文件: 在我们的游戏工程里,Scene视图里会包含我们需要游戏的所有游戏对象,我们也可以把整个场景封装在AssetsBundle中。需要说明的是,它不能在移动平台上用。因为移动平台上不能更新脚本的。简单的说来,就是在移动平台上,即使下载了AssetsBundle,脚本也不会执行。移动平台: 因为在移动平台脚本不能更新,所以开发者无法绕过App store和 google play这种在线商店升级应用程序。唯一能做到的就是更新资源。例如,在我们的游戏版本号,在处理版本升级的时候,有大版本号和小版本号。大版本号主要是升级游戏脚本,需要在AppStore中更新,如4.0,5.0这都属于大版本号。小版本号是如4.1.2,5.0.2这种只是更新游戏中的资源,通过自己游戏的服各器就可以完成。通过AssetsBundle在自己服务器上下载,然后适应在游戏中。如果非要更新脚本信息,必须要更新脚本那么只能在AppStore或者googlePlay去更新大版本。移动平台上绑定脚本处理: 移动平台上不能更新脚本,对于prefab上绑定的脚本,程序通过服务器下载这个AssetsBundle,载入到工程中这个绑定的脚本是不会被执行的。但是对于如果本地工程有这个被绑定的脚本,那么unity会自动将这条脚本绑定在下载的prefab中,并且他们执行的非常好。需要注意的是,有时我们会在脚本中写一些public 变量,有可能不同的prefab上, 有可能不同的Prefab上绑定的是相同的脚本,只是Inspector 脚本中的public参数不同。别担心这一点Assetbundle 中的Prefab也是没问题,所以说只要大版本中的脚本没问题,在小版本中只更新游戏资源是一点问题都么有的。移动优化: 之前我们说过可以将游戏中的某个游戏对象封装成Assetbundle,也可以将游戏中的整个场景也封装成Assetbundle。但是我认为需要巧妙的使用封装场景,因为场景中肯定有很多公用的模型,如果打包场景的话那么内存与size就是 公用模型的size * N个场景,想想其实挺恐怖的。其实我们可以巧妙的使用,首先把场景中公用的部分和私有的部分统统放入Unity, 然后烘培整个场景。 当场景烘培完毕后把公用的模型部分在拿出去,场景只只保留私有的模型。还可以做一个工具将公用模型在场景中的坐标保存在XML中(每个场景文件会对应一个公用模型的XML信息),最后在将公用的模型分别封装在别的Assetbundle中。服务器上提供每个场景的Assetbundle ,和公用模型的Assetbundle,一般公用模型的Assetbundle可以放在常驻内存中(可能使用频繁、根据项目的不同而定)场景Assetbundle下载完毕后,现载入场景然后在根据场景对应的XML信息将公用模型部分动态的在添加到场景中,这样就完成了一个场景的构建。在理解了上面的几个概念之后,我们来时行项目制作。首先,我们先创建一个场景,如下图,场景中有模型有脚本。选中两个模型的prefab,并在模型上添加两个相应的脚本,我们为了印证脚本的运行,运行的时候打印一串字符串。添加在模型身上的脚本如下:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667usingUnityEngine;usingSystem.Collections;publicclassScript:MonoBehaviourpublicstringname;voidAwake()Debug.Log(mynameis+name);我们先创建AssetsBundle,在Project-Assets-Editor文件下创建脚本usingUnityEngine;usingSystem.Collections;usingUnityEditor;publicclassTest:EditorMenuItem(CustomEditor/CreateAssetBunldesMain)staticvoidCreateAssetBunldesMain()/获取在Project视图中选择的所有游戏对象ObjectSelectedAsset=Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets);/遍历所有的游戏对象foreach(ObjectobjinSelectedAsset)/本地测试:建议最后将Assetbundle放在StreamingAssets文件夹下,如果没有就创建一个,因为移动平台下只能读取这个路径/StreamingAssets是只读路径,不能写入/服务器下载:就不需要放在这里,服t务器上客户端用www类进行下载。stringtargetPath=Application.dataPath+/StreamingAssets/++.assetbundle;if(BuildPipeline.BuildAssetBundle(obj,null,targetPath,BuildAssetBundleOptions.CollectDependencies)Debug.Log(+资源打包成功|);elseDebug.Log(+资源打包失败);/刷新编辑-器AssetDatabase.Refresh();MenuItem(CustomEditor/CreateAssetBunldesALL)staticvoidCreateAssetBunldesALL()Caching.CleanCache();stringPath=Application.dataPath+/StreamingAssets/ALL.assetbundle;ObjectSelectedAsset=Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets);foreach(ObjectobjinSelectedAsset)Debug.Log(CreateAssetBunldesname:+obj);/这里注意第二个参数就行if(BuildPipeline.BuildAssetBundle(null,SelectedAsset,Path,BuildAssetBundleOptions.CollectDependencies)AssetDatabase.Refresh();elseMenuItem(CustomEditor/CreateScene)staticvoidCreateSceneALL()/清空一下缓存Caching.CleanCache();stringPath=Application.dataPath+/MyScene.unity3d;stringlevels=Assets/Level.unity;/打包场景BuildPipeline.BuildPlayer(levels,Path,BuildTarget.WebPlayer,BuildOptions.BuildAdditionalStreamedScenes);AssetDatabase.Refresh();Create Assetbundles Main: 分开打包,会生成两个AsstesBundle.Create Asstebundles All: 将所有对象打包在一个AssetsBundle中备注:需要说明的是,如果选中的是两个prefab,则打包的是这两个prefab,如果没有选中任何prefab.打包的时候,会把工程里所有的prefab,都会进行打包Create Scence: 是把现在的场景进行打包。进行到上面,我们已经打包完成。下面给大家介绍一下如何读取Asstesbundle.我们创建脚本,并放在像机上代码如下:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071usingUnityEngine;usingSystem.Collections;publicclassRunScript:MonoBehaviour/不同平台下StreamingAssets的路径是不同的,这里需要注意一下。publicstaticreadonlystringPathURL=#ifUNITY_ANDROIDjar:file:/+Application.dataPath+!/assets/;#elifUNITY_IPHONEApplication.dataPath+/Raw/;#elifUNITY_STANDALONE_WIN|UNITY_EDITORfile:/+Application.dataPath+/StreamingAssets/;#elsestring.Empty;#endifvoidOnGUI()if(GUILayout.Button(MainAssetbundle)StartCoroutine(LoadMainCacheGameObject(PathURL+Prefab0.assetbundle);StartCoroutine(LoadMainCacheGameObject(PathURL+Prefab1.assetbundle);if(GUILayout.Button(ALLAssetbundle)StartCoroutine(LoadALLGameObject(PathURL+ALL.assetbundle);if(GUILayout.Button(OpenScene)StartCoroutine(LoadScene();/读取一个资源privateIEnumeratorLoadMainGameObject(stringpath)/在C#中,需要a用到yield的话,必须建立在IEnumerator类中执行。/开始下载被指定的路径WWWbundle=newWWW(path);/定义bundle为WWW类型并且等于所下载下来的WWW中内容。yieldreturnbundle;/加载到游戏中yieldreturnInstantiate(bundle.assetBundle.mainAsset);bundle.assetBundle.Unload(false);/读取全部资源privateIEnumeratorLoadALLGameObject(stringpath)WWWbundle=newWWW(path);yieldreturnbundle;/通过Prefab的名称把他们都读取出来Objectobj0=bundle.assetBundle.Load(Prefab0);Objectobj1=bundle.assetBundle.Load(Prefab1);/加载到游戏中yieldreturnInstantiate(obj0);yieldreturnInstantiate(obj1);bundle.assetBundle.Unload(false);privateIEnumeratorLoadMainCacheGameObject(stringpath)WWWbundle=WWW.LoadFromCacheOrDownload(path,5);yieldreturnbundle;/加载到游戏中yieldreturnInstantiate(bundle.assetBundle.mainAsset);bundle.assetBundle.Unload(false);privateIEnumeratorLoadScene()WWWdownload=WWW.LoadFrom

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论