loading代码_LuaFramework热更新过程及可更新的loading界面实现)(三)

472a055cfffabd36928d03919c476949.png

4.可更新的loading界面

前提:

1)如果想更新,则必须把loading界面打包进资源包

2)在第一次打开游戏的时候,下载资源阶段之前,还没有loading界面的资源包,但是此刻无疑是必须显示loading的

3)生成loading界面的两种过程:

使用Resource.Load(不可热更新)

1  public void CreateLoadingPanelFromResource()
 2     {
 3         _MemoryPoolManager_ memMgr = AppFacade.Instance.GetManager<_MemoryPoolManager_>(ManagerName._Pool_);
 4 
 5          Debug.Log("--------------------Resources加载loading--------------------------------");
 6 
 7             memMgr.AddPrefabPoolRS("LoadingPanel", 1, 1, true, null);
 8             //            memMgr.AddPrefabPoolAB ("loading", "LoadingPanel", 1, 1, true, null);
 9 
10             Transform loadingPanel = _MemoryPoolManager_.Spawn("LoadingPanel", true);
11             loadingPanel.SetParent(GameObject.Find("2DERoot/Resolution").transform);
12             loadingPanel.localPosition = Vector3.zero;
13             loadingPanel.localScale = new Vector3(1, 1, 1);
14 
15             _slider = loadingPanel.FindChild("LoadingSlider").GetComponent<Slider>();
16             _text = loadingPanel.FindChild("LoadingSlider/Text").GetComponent<Text>();
17             _text.gameObject.SetActive(true);
18             _text.transform.localPosition = Vector3.zero;
19             _slider.value = 5;
20             _text.text = "准备启动游戏";
21             _isStartupLoading = true;
22 
23             KeyFrameWork.MVC.SendEvent(FWConst.E_ShowLog, "Resources load finish");

使用加载AssetBundle资源包的方式

public IEnumerator CreateLoadingPanelFromAssetBundle()
 2         {
 3         string url = Util.GetRelativePath() + "loading.unity3d";
 4        Debug.Log("--------------------AssetBundle加载Loading--------------------------------" + url);
 5 
 6    
 7             WWW www = WWW.LoadFromCacheOrDownload(url, 0, 0);
 9             yield return www;
11             AssetBundle bundle = www.assetBundle;
12             GameObject asset = bundle.LoadAsset<GameObject>("LoadingPanel");
13             Transform loadingPanel = Instantiate<GameObject>(asset).GetComponent<Transform>();
15   //memMgr.AddPrefabPoolRS("LoadingPanel", 1, 1, true, null);
16  //Transform loadingPanel = _MemoryPoolManager_.Spawn ("LoadingPanel", true);
17 
18             
19 
20             loadingPanel.SetParent(GameObject.Find("2DERoot/Resolution").transform);
21             loadingPanel.localPosition = Vector3.zero;
22             loadingPanel.localScale = new Vector3(1, 1, 1);
23             loadingPanel.name = "LoadingPanel(Clone)001";
26            _slider = loadingPanel.FindChild("LoadingSlider").GetComponent<Slider>();
27            _text = loadingPanel.FindChild("LoadingSlider/Text").GetComponent<Text>();
28             _text.gameObject.SetActive(true);
29             _slider.value = 5;
30 
31             _isStartupLoading = true;
32 
33             //加载loading完成后再开始lua,保证lua能顺利接管loading
34             AppFacade.Instance.StartUp();            //启动游戏
35 
36             KeyFrameWork.MVC.SendEvent(FWConst.E_ShowLog, "AssetBundle load finish");
37
38         }

在游戏开始的时候使用判断

(Directory.Exists(Util.DataPath) && Directory.Exists(Util.DataPath + "lua/") && File.Exists(Util.DataPath + "files.txt")

来确定当前是否是第一次开启游戏,如果是,则使用Resource.Load,如果不是则使用加载AssetBundle资源包的方式。

这里需要着重说下加载AssetBundle资源包时的顺序问题,由于ResourceManager需要Manifest关联文件(用以确定各个资源包之间的引用关系)进行初始化,所以ResourceManager初始化必在下载资源之后,而下载资源时无疑是需要显示loading的,

故顺序是:

加载AssetBundle资源包 -> 下载资源 -> ResourceManager初始化。

在这个顺序下,虽然ResourceManager有加载AssetBundle资源包的接口,但是不能用。而加载AssetBundle资源包是需要异步加载的,也就是说,显示loading需要1秒左右的时间(根据具体loading资源和手机硬件而定),若是需要在lua里接管loading(通过Find函数找到loading界面然后在lua里做一个引用),则必须在loading资源包加载完毕后才能执行lua接管loading的代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值