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的代码