赞
踩
http://blog.csdn.net/qq_19399235/article/details/51702964
本文参考的AssetBundle技术文章:http://liweizhaolili.blog.163.com/blog/static/16230744201541410275298/
[csharp] view plain copy
- using UnityEngine;
- using System.Collections;
- using System.IO;
- using UnityEditor;
- using xk_System.AssetPackage;
- public class ExportAssetInfoEditor : MonoBehaviour
- {
- static string extention = AssetBundlePath.getSingle().ABExtention;
- static string BuildAssetPath = "Assets/ResourceABs";
- static string CsOutPath = "Assets/Scripts/auto";
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~创建AB文件所有的信息~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- [MenuItem("UnityEditor/Asset/Auto Generic Cs File")]
- public static void GenericABInfo()
- {
- CreateABCSFile();
- Debug.Log("创建资源cs文件完成");
- }
- public static void CreateABCSFile()
- {
- string m = "using UnityEngine;\nusing System.Collections;\nusing xk_System.BaseClass;\n";
- m += "namespace xk_System.AssetPackage\n{\n";
- DirectoryInfo mDir = new DirectoryInfo(BuildAssetPath);
- m += "\tpublic class " + mDir.Name + "Folder : Single<" + mDir.Name + "Folder>\n\t{\n";
- string s = "";
- foreach (var v in mDir.GetDirectories())
- {
- FileInfo[] mFileInfos1 = v.GetFiles();
- int mFilesLength1 = 0;
- foreach (var v1 in mFileInfos1)
- {
- if (v1.Extension != ".meta")
- {
- mFilesLength1++;
- break;
- }
- }
- if (mFilesLength1 > 0 || v.GetDirectories().Length > 0)
- {
- string fieldName = v.Name + "Folder";
- m += "\t\t public " + fieldName + " " + v.Name + "=new " + fieldName + "();\n";
- }
- s += CreateDirClass(v, v.Name.ToLower());
- }
- m += "\t}\n";
- m += s;
- m += "}\n";
- string fileName = CsOutPath + "/" + mDir.Name + ".cs";
- StreamWriter mSw = new StreamWriter(fileName, false);
- mSw.Write(m);
- mSw.Close();
- }
- public static string CreateDirClass(DirectoryInfo mDir, string bundleName)
- {
- string m = "";
- string s = "";
- FileInfo[] mFileInfos = mDir.GetFiles();
- int mFilesLength = 0;
- foreach (var v in mFileInfos)
- {
- if (v.Extension != ".meta")
- {
- mFilesLength++;
- break;
- }
- }
- if (mFilesLength > 0)
- {
- string bundleName1 = bundleName+ extention;
- m = "\tpublic class " + mDir.Name + "Folder\n\t{\n";
- foreach (var v in mFileInfos)
- {
- if (v.Extension != ".meta")
- {
- string fileName = v.Name.Substring(0, v.Name.LastIndexOf(v.Extension));
- m += "\t\t public AssetInfo m" + fileName + "=new AssetInfo(\"" + bundleName1 + "\",\"" + v.Name + "\");\n";
- }
- }
- m += "\t}\n";
- }
- else
- {
- if (mDir.GetDirectories().Length > 0)
- {
- m = "\tpublic class " + mDir.Name + "Folder\n\t{\n";
- foreach (var v in mDir.GetDirectories())
- {
- FileInfo[] mFileInfos1 = v.GetFiles();
- int mFilesLength1 = 0;
- foreach (var v1 in mFileInfos1)
- {
- if (v1.Extension != ".meta")
- {
- mFilesLength1++;
- break;
- }
- }
- if (mFilesLength1 > 0 || v.GetDirectories().Length > 0)
- {
- string fieldName = v.Name + "Folder";
- m += "\t\t public " + fieldName + " " + v.Name + "=new " + fieldName + "();\n";
- }
- s += CreateDirClass(v, bundleName+"_"+v.Name.ToLower());
- }
- m += "\t}\n";
- m += s;
- }
- }
- return m;
- }
- }
生成的资源信息管理类的代码样式如下:
[csharp] view plain copy
- using UnityEngine;
- using System.Collections;
- using xk_System.BaseClass;
- namespace xk_System.AssetPackage
- {
- public class ResourceABsFolder : Single<ResourceABsFolder>
- {
- public atlasFolder atlas=new atlasFolder();
- public managerFolder manager=new managerFolder();
- public scriptsFolder scripts=new scriptsFolder();
- public sheetFolder sheet=new sheetFolder();
- public viewFolder view=new viewFolder();
- }
- public class atlasFolder
- {
- public loginFolder login=new loginFolder();
- }
- public class loginFolder
- {
- public AssetInfo m111=new AssetInfo("atlas_login.xk_unity3d","111.jpg");
- public AssetInfo m222=new AssetInfo("atlas_login.xk_unity3d","222.jpg");
- public AssetInfo m333=new AssetInfo("atlas_login.xk_unity3d","333.jpg");
- public AssetInfo m444=new AssetInfo("atlas_login.xk_unity3d","444.jpg");
- public AssetInfo mbackground_fwqgx_00=new AssetInfo("atlas_login.xk_unity3d","background_fwqgx_00.png");
- public AssetInfo mbackground_fwqgx_1=new AssetInfo("atlas_login.xk_unity3d","background_fwqgx_1.png");
- public AssetInfo mbackground_gx_00=new AssetInfo("atlas_login.xk_unity3d","background_gx_00.png");
- public AssetInfo mbutton_close_00=new AssetInfo("atlas_login.xk_unity3d","button_close_00.png");
- public AssetInfo mbutton_close_01=new AssetInfo("atlas_login.xk_unity3d","button_close_01.png");
- public AssetInfo mbutton_close_02=new AssetInfo("atlas_login.xk_unity3d","button_close_02.png");
- public AssetInfo mbutton_close_03=new AssetInfo("atlas_login.xk_unity3d","button_close_03.png");
- public AssetInfo mcs_bg_champions=new AssetInfo("atlas_login.xk_unity3d","cs_bg_champions.png");
- public AssetInfo mLOL_qqlogin=new AssetInfo("atlas_login.xk_unity3d","LOL_qqlogin.png");
- public AssetInfo mtips=new AssetInfo("atlas_login.xk_unity3d","tips.png");
- public AssetInfo mUdyr_bear=new AssetInfo("atlas_login.xk_unity3d","Udyr_bear.png");
- public AssetInfo mUdyr_phoenix=new AssetInfo("atlas_login.xk_unity3d","Udyr_phoenix.png");
- public AssetInfo mUdyr_tiger=new AssetInfo("atlas_login.xk_unity3d","Udyr_tiger.png");
- public AssetInfo mUdyr_turtle=new AssetInfo("atlas_login.xk_unity3d","Udyr_turtle.png");
- }
- public class managerFolder
- {
- public AssetInfo mEventSystem=new AssetInfo("manager.xk_unity3d","EventSystem.prefab");
- public AssetInfo mGlobalWindowManager=new AssetInfo("manager.xk_unity3d","GlobalWindowManager.prefab");
- public AssetInfo mModulesWindowManager=new AssetInfo("manager.xk_unity3d","ModulesWindowManager.prefab");
- }
- public class scriptsFolder
- {
- public AssetInfo mtest=new AssetInfo("scripts.xk_unity3d","test.bytes");
- }
- public class sheetFolder
- {
- public AssetInfo mDB=new AssetInfo("sheet.xk_unity3d","DB.xml");
- }
- public class viewFolder
- {
- public AssetInfo mChatView=new AssetInfo("view.xk_unity3d","ChatView.prefab");
- public AssetInfo mHotUpdateView=new AssetInfo("view.xk_unity3d","HotUpdateView.prefab");
- public AssetInfo mLoginView=new AssetInfo("view.xk_unity3d","LoginView.prefab");
- public AssetInfo mMainView=new AssetInfo("view.xk_unity3d","MainView.prefab");
- public AssetInfo mSelectServerView=new AssetInfo("view.xk_unity3d","SelectServerView.prefab");
- public AssetInfo mShareView=new AssetInfo("view.xk_unity3d","ShareView.prefab");
- }
- }
到这里,这个资源基本信息管理类就处理好了。
2:我们就正式开始写资源管理架构类了
我们首先写一个AssetBundleManager类,这个类的目的专门用来更新完毕后,充当资源加载管理器。代码如下
现在 资源管理架构设计就完了。
3:加载完程序集后该如何使用这个程序集就是重点了。
刚开始想这个问题的时候感觉无非反射了这么简单的问题,后来越想感觉越复杂,幸好,崩溃完了之后,发现其实,你只要遵守2点即可实现游戏代码全部更新。
(1):我们前面已经做完了,加载资源和加载程序集的工作,那么我们现在要做的工作,就是实现这个新加载的程序集的入口。
切记,这个入口要通过动态添加组件的方式出现。如:
Type mType = mHotUpdateAssembly.GetType(typeFullName);
obj.AddComponent(mType);
(2):要注意所有的预制件上要动态添加脚本,否则,预制件会去寻找【本地程序集】的脚本添加上去,并且还会导致【本地程序集】与【热更新程序集】相互访问的问题。
在这里要注意一点:因为我们已经提供了【热更新程序集】的入口,所以,接下来程序动态添加脚本就会使用【热更新程序集】里脚本。千万不要再去反射程序集里某某个脚本了,加载脚本,还和以前一样写就好了。如:
obj.AddComponent<T>(); 这里与入口动态添加的方式可不一样啊。(没有反射的)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。