Unity热更新专题(九)Unity热更新实例

发表于2017-03-13
评论0 3.6k浏览

前面给大家讲解了一些unity的热更新知识。也知道了用uLua进行Unity热更新的大概方法。现在我们通过一个实例,来实现Unity热更新。


我们在这里仿照上一节进行UI的热更新。

首先创建你自己的UI界面,然后制成Prefab。然后再Asset Labels里AssetBundle里命名。这里要注意,制作UI所用到的所有素材也都要制成AssetBundle。

然后就是代码部分了。

首先,我们创建个空物体,添加脚本GlobalGenerator.cs脚本。
[csharp] view plain copy
 
 
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. namespace SimpleFramework {  
  5.     ///   
  6.     /// 全局构造器,每个场景里都有,所以每个场景都会初始化一遍,也会初始化游戏管理器一次  
  7.     /// 如果游戏管理器已经存在了,就跳过了,否则创建游戏管理器,来保证游戏里只有一个GameManager  
  8.     ///   
  9.     public class GlobalGenerator : MonoBehaviour {  
  10.   
  11.         void Awake() {  
  12.             InitGameMangager();  
  13.         }  
  14.   
  15.         ///   
  16.         /// 实例化游戏管理器  
  17.         ///   
  18.         public void InitGameMangager() {  
  19.             string name = "GameManager";  
  20.             gameObject.AddComponent();  
  21.   
  22.             GameObject manager = GameObject.Find(name);  
  23.             if (manager == null) {  
  24.                 manager = new GameObject(name);  
  25.                 manager.name = name;  
  26.   
  27.                 AppFacade.Instance.StartUp();   //启动游戏  
  28.             }  
  29.         }  
  30.     }  
  31. }  


更改GameManager.lua脚本:
[plain] view plain copy
 
 
  1. require "Common/define"  
  2.   
  3. require "Controller/BottomCtrl"  
  4. require "Controller/SettingsCtrl"  
  5. require "Controller/DialogCtrl"  
  6.   
  7.   
  8. GameManager = {}  
  9.   
  10. local this = GameManager  
  11.   
  12.   
  13. function GameManager.LuaScriptPanel()  
  14.     return 'Bottom','Settings','Dialog'  
  15. end  
  16.   
  17. function GameManager.OnInitOK()  
  18.     AppConst.SocketPort = 2012  
  19.     AppConst.SocketAddress = "127.0.0.1"  
  20.     NetManager:SendConnect()  
  21.       
  22.     BottomCtrl.Awake()  
  23.     SettingsCtrl.Awake()  
  24.     DialogCtrl.Awake()  
  25. end  

这个脚本可以参照原示例来写。
其中:
[plain] view plain copy
 
 
  1. function GameManager.LuaScriptPanel()  
  2.     return 'Bottom','Settings','Dialog'  
  3. end  


与我们需要热更的对应:


然后就是三个对应的View脚本:

[plain] view plain copy
 
 
  1. SettingsPanel = {}  
  2. local this = SettingsPanel  
  3.   
  4. local transform  
  5. local gameObject  
  6.   
  7. function SettingsPanel.Awake(obj)  
  8.     gameObject = obj  
  9.     transform = gameObject.transform  
  10.       
  11.     this.InitPanel()  
  12. end  
  13.   
  14. function SettingsPanel.InitPanel()  
  15.     this.anim = transform:FindChild("Bg"):GetComponent("Animator")  
  16.     this.buttonClose = transform:FindChild("Bg/ButtonClose").gameObject  
  17.       
  18. end  


[plain] view plain copy
 
 
  1. BottomPanel={}  
  2.   
  3. local this = BottomPanel  
  4. local transfrom  
  5. local gameObject  
  6.   
  7. function BottomPanel.Awake(obj)  
  8.     gameObject = obj  
  9.     transfrom = obj.transform  
  10.       
  11.     this.InitPanel()  
  12. end  
  13.   
  14. function BottomPanel.InitPanel()  
  15.     this.buttonSettings = transfrom:FindChild("ButtonSettings").gameObject  
  16.     this.buttonPeople = transfrom:FindChild("ButtonPeople").gameObject  
  17.     this.buttonDialog = transfrom:FindChild("ButtonDialog").gameObject  
  18. end  


[plain] view plain copy
 
 
  1. DialogPanel = {}  
  2. local this = DialogPanel  
  3. local transform  
  4. local gameObject  
  5.   
  6. function DialogPanel.Awake(obj)  
  7.     gameObject = obj  
  8.     transform = obj.transform  
  9.       
  10.     this.InitPanel()  
  11. end  
  12.   
  13. function DialogPanel.InitPanel()  
  14.     this.anim = transform:FindChild("Bg"):GetComponent("Animator")  
  15.     this.buttonClose = transform:FindChild("Bg/ButtonClose").gameObject  
  16. end  

对应的Controller下的脚本。

[plain] view plain copy
 
 
  1. require "Common/define"  
  2.   
  3.   
  4. SettingsCtrl = {}  
  5. local this = SettingsCtrl  
  6.   
  7. local transform  
  8. local gameObject  
  9. local lua  
  10.   
  11.   
  12. function SettingsCtrl.New()  
  13.     return this  
  14. end  
  15.   
  16. function SettingsCtrl.Awake()  
  17.     PanelManager:CreatePanel( "Settings", this.OnCreate )  
  18. end  
  19.   
  20. function SettingsCtrl.OnCreate(obj)  
  21.     gameObject = obj  
  22.     transform = obj.transform  
  23.       
  24.     lua = gameObject:GetComponent("LuaBehaviour")  
  25.     lua:AddClick( SettingsPanel.buttonClose,this.OnButtonClose )  
  26. end  
  27.   
  28. function SettingsCtrl.OnButtonClose()  
  29.     this.Hide()  
  30. end  
  31.   
  32. function SettingsCtrl.Show()  
  33.         SettingsPanel.anim:SetBool("IsShow",true)  
  34. end  
  35. function SettingsCtrl.Hide()  
  36.         SettingsPanel.anim:SetBool("IsShow",false)  
  37. end  

[plain] view plain copy
 
 
  1. require "Common/define"  
  2.   
  3. DialogCtrl = {}  
  4. local this = DialogCtrl  
  5. local transforml  
  6. local gameObject  
  7. local lua  
  8.   
  9.   
  10. function DialogCtrl.New()  
  11.     return this  
  12. end  
  13.   
  14. function DialogCtrl.Awake()  
  15.     PanelManager:CreatePanel( "Dialog", this.OnCreate )  
  16. end  
  17.   
  18. function DialogCtrl.OnCreate(obj)  
  19.     gameObject = obj  
  20.     transform = obj.transform  
  21.       
  22.     lua = gameObject:GetComponent("LuaBehaviour")  
  23.     lua:AddClick( DialogPanel.buttonClose,this.OnButtonClose )  
  24. end  
  25.   
  26. function DialogCtrl.OnButtonClose()  
  27.     this.Hide()  
  28. end  
  29.   
  30. function DialogCtrl.Show()  
  31.         DialogPanel.anim:SetBool("IsShow",true)  
  32. end  
  33. function DialogCtrl.Hide()  
  34.         DialogPanel.anim:SetBool("IsShow",false)  
  35. end  

[plain] view plain copy
 
 
  1. require "Common/define"  
  2.   
  3. BottomCtrl = {}  
  4. local this = BottomCtrl  
  5. local transform  
  6. local gameObject  
  7. local lua  
  8.   
  9.   
  10. function BottomCtrl.New()  
  11.     return this  
  12. end  
  13.   
  14. function BottomCtrl.Awake()  
  15.     PanelManager:CreatePanel( "Bottom",this.OnCreate )  
  16. end  
  17.   
  18. function BottomCtrl.OnCreate(obj)  
  19.     gameObject = obj  
  20.     transform = gameObject.transform  
  21.       
  22.     lua = gameObject:GetComponent("LuaBehaviour")  
  23.     lua:AddClick( BottomPanel.buttonDialog,this.OnButtonDialogClick )  
  24.     lua:AddClick( BottomPanel.buttonPeople,this.OnButtonPeopleClick )  
  25.     lua:AddClick( BottomPanel.buttonSettings,this.OnButtonSettingsClick )  
  26.       
  27. end  
  28.   
  29. function BottomCtrl.OnButtonDialogClick()  
  30.     DialogCtrl.Show()  
  31. end  
  32.   
  33. function BottomCtrl.OnButtonPeopleClick()  
  34.       
  35. end  
  36.   
  37. function BottomCtrl.OnButtonSettingsClick()  
  38.     SettingsCtrl.Show()  
  39. end  


我们在运行前,要先Clear,再Build。

运行结果如下:



这就是一个简单的实例。

unity有了很多lua的绑定库,也有了ulua这样的pure c#移植实现。

你还有一个选择是C#Light/Evil,他是C#语法的,pure c#实现的一门新生脚本语言,就是为了Unity3D逻辑热更新而生。

以后再讨论。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引