在开发热更新游戏的时候,正常代码中,资源是从AB包中读取的。我们正常的更新预制体和资源的流程是需要将图片资源和预制体打包到AB包中,然后将AB包放到服务器上,游戏开始时候通过代码比对版本和资源信息差异,去将新增加的或者md5码不同的AB包下载下来,存放到沙盒中,然后再通过AB包去获取资源。
开发的时候,我们需要频繁的修改预制与调试,所以即使是不比对,直接获取本地的AB包,也会很繁琐。所以需要使用宏定义来简化我们的调试流程。
我们知道,在C#代码中有一种代码叫预编译,是为了打包不同平台时候,使用不用部分代码的问题。像这样:
#if UNITY_EDITOR
Debug.Log("这是编辑器平台!");
#elif UNITY_ANDROID
Debug.Log("这是安卓平台!");
#else
Debug.Log("这是其他平台!");
#endif
在判断的后面,其实我们不仅可以填写平台名称,也可以填写自己命名的新的宏名称。比如:DEVELOP_MODEL
#if DEVELOP_MODEL
Debug.Log("这是调试模式!");
#else
Debug.Log("这不是调试模式!");
#endif
我们只要在DEVELOP_MODEL的判断里:写上通过本地读取资源的代码,在else的判断里写上正常从AB读取资源的代码就可以了。
如下:
#if DEVELOP_MODEL
//Debug.Log("is Develop_model");
GameObject w = (GameObject)AssetDatabase.LoadAssetAtPath("Assets/Prefabs/Window/" + name + ".prefab", typeof(GameObject));
GameObject c = CTools.addUIChild (w, m_MidWindow, delegate (GameObject obj) { });
c.gameObject.SetActive (true);
if (callback != null){
callback (c);}
break;
#else
CABManager.instance.GetAssetBundle (name, delegate (AssetBundle ab) {
GameObject window = (GameObject) ab.LoadAsset (name);
GameObject clone = CTools.addUIChild (window, m_MidWindow, delegate (GameObject obj) { });
clone.gameObject.SetActive (true);
if (callback != null)
callback (clone);
});
break;
#endif
这里需要说明的是:
Resources.Load()方法只能读取Resources文件下的资源。需要读取其他文件夹的资源,需要使用AssetDatabase.LoadAssetAtPath()方法。