使用【宏定义】解决:开发热更新游戏时,调试需要频繁打包的问题

在开发热更新游戏的时候,正常代码中,资源是从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()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值