xlua 實現協程替換Unity中的協程


C#中的協程:

 1      IEnumerator ShowSpiritInfo()
 2         {
 3             UIMessageMgr.ShowMsgWait(true);
 4 
 5             DestroyUIModelInfo();
 6 
 7             bool isLoad = false;
 8             AppInterface.GUIModule.CreateUISpirit(currSpiritId, delegate(UISpirit sp)
 9             {
10                 infoTextureCtrl.TargetSpirit = sp;
11                 infoTextureCtrl.ui_Tx.width = 720;
12                 infoTextureCtrl.ui_Tx.height = 720;
13                 isLoad = true;
14             });
15             while (!isLoad)
16                 yield return null;
17             modelTex.enabled = true;
18             UIMessageMgr.ShowMsgWait(false);
19         }

xlua中實現以上協程:

 1 local ShowSpiritInfo = function(previewWnd)  2     return util.cs_generator(function()  3         CS.UIMessageMgr.ShowMsgWait(true);
 4 
 5         previewWnd:DestroyUIModelInfo();
 6 
 7         -- 加載精靈
 8         local PlayerManager = CS.Common.AppInterface.GUIModule.PlayerManager;
 9         local root = PlayerManager.m_ModelRoot;
10         local spirit = CS.UISpirit(PlayerManager.m_ModelRoot, previewWnd.currSpiritId);
11         PlayerManager.listSpirit:Add(spirit);
12         PlayerManager.dicSpirit:Add(spirit.number, spirit);
13         local isLoad = false;
14         spirit:BeginLoad(function() 
15             isLoad = true;
16         end);
17         while false == isLoad do 
18             coroutine.yield(CS.UnityEngine.WaitForSeconds(0.01)); 19         end
20 
21         previewWnd.infoTextureCtrl.TargetSpirit = spirit;
22         previewWnd.infoTextureCtrl.ui_Tx.width = 720;
23         previewWnd.infoTextureCtrl.ui_Tx.height = 720;
24         previewWnd.modelTex.enabled = true;
25 
26         CS.UIMessageMgr.ShowMsgWait(false);
27     end)
28 end;

xlua中主要是 1、2、17、18、19行的寫法。

調用(第10行實現):

 1 xlua.hotfix(CS.Modules.UI.UI_SpiritPreviewWnd, "OnChooseHandle", function(self, index)
 2     if index >= 0 and index <= self.currSpiritConfigList.Count then
 3         self.currSpiritConfig = self.currSpiritConfigList[index];
 4         self.currSpiritId = self.currSpiritConfig.f_SpiritID;
 5         self.currSpiritData = CS.ClientData.ClientSpiritData.CreateSpiritData(self.currSpiritId);
 6         self:RefreshSpiritInfo();
 7         if 0 == self.currSpiritConfigList[index].f_NextStarID then
 8             CS.GameDefine.Mono:StartCoroutine(ShowCharacterInfo(self));
 9         else
10  CS.GameDefine.Mono:StartCoroutine(ShowSpiritInfo(self)); 11         end
12     end
13 end)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM