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

Unity 热更新 之 huatuo(HybridCLR) 一句话说说huatuo和Hybridclr:huatuo是途游开源的,之前hybird的作者在途游,后来开源华佗,后来被途游收回,就写了hybirdCLR; huatuo热更新是基于IL2CPP VM这个环节来的,和其他热更技术不同; Lua方案:Lua内置Lua虚拟机 + Lua代码 (是在Native excutable asm 环节) ILRuntime方案:内置C#虚拟机 + 解释执行ILRuntime(是在Native excutable asm 环节) 阅读详情

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

经过前面的学习。我们已经知道了用uLua进行Unity热更新的大概方法了。现在我们通过一个实例,来实现Unity热更新。

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

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

然后就是代码部分了。

首先,我们创建个空物体,添加脚本GlobalGenerator.cs脚本。
[csharp]  view plain  copy
 print ?
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. namespace SimpleFramework {  
  5.     /// <summary>  
  6.     /// 全局构造器,每个场景里都有,所以每个场景都会初始化一遍,也会初始化游戏管理器一次  
  7.     /// 如果游戏管理器已经存在了,就跳过了,否则创建游戏管理器,来保证游戏里只有一个GameManager  
  8.     /// </summary>  
  9.     public class GlobalGenerator : MonoBehaviour {  
  10.   
  11.         void Awake() {  
  12.             InitGameMangager();  
  13.         }  
  14.   
  15.         /// <summary>  
  16.         /// 实例化游戏管理器  
  17.         /// </summary>  
  18.         public void InitGameMangager() {  
  19.             string name = "GameManager";  
  20.             gameObject.AddComponent<AppView>();  
  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
 print ?
  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
 print ?
  1. function GameManager.LuaScriptPanel()  
  2.     return 'Bottom','Settings','Dialog'  
  3. end  


与我们需要热更的对应:


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

[plain]  view plain  copy
 print ?
  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
 print ?
  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
 print ?
  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
 print ?
  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
 print ?
  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
 print ?
  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逻辑热更新而生。

以后再讨论。

====================================================================================

结束。


Unity游戏开发客户端面经——热更新(初级) Unity游戏开发客户端面经 之 热更新 篇 阅读详情

相关推荐

Unity2020 几种常用热更新方案的优劣及XLua实战

了解热更新之前,首先得知道为啥要用热更新? 为了省去用户自行更新客户端的步骤,从而改善用户体验。 Unity热更新方案一、几种常用热更新方案的区别1、uLua2、xLua3、toLua4、ILRuntime5、uLua二、下载地址及教程 一、几种常用热更新方案的区别 热更新 1、uLua 2、xLua 3、toLua 4、ILRuntime 5、uLua 二、下载地址及教程 ...

小程小程,永不消沉 1万+

Unity 热更新技术 | (一) 热更新的基本概念原理及主流热更新方案介绍

开始学习热更新方面系列知识,就从这一篇开始吧! 本系列教程 会从热更新基本概念出发,详细介绍热更新相关的全套知识点。 如热更新技术基本原理、热更新主流方案、AssetBundle系列教程、Lua语言编程、Lua与Unity交互教程、Xlua框架使用、热更新实战教程等方面。 热更新作为一个开发者必备技能,如果想学习的话,可以从现在开始了哦~ 接下来先从热更新的基本概念原理及主流热更新方案介绍 开始学习吧!

努力前行,总会成为自己心中的那道光 2万+

Unity 热更新技术 |(七)完整热更新实战案例学习使用,包括资源热更新及代码热更新【文末书】

开始学习热更新方面系列知识,就从这一篇开始吧!本系列教程会从热更新基本概念出发,详细介绍热更新相关的全套知识点。如热更新技术基本原理、热更新主流方案、AssetBundle系列教程、Lua语言编程、Lua与Unity交互教程、Xlua框架使用、热更新实战教程等方面。热更新作为一个开发者必备技能,如果想学习的话,可以从现在开始了哦~接下来从热更新实战案例学习使用开始学习吧!

努力前行,总会成为自己心中的那道光 1万+

Unity热更新技术

Unity热更新技术为游戏开发带来了很多便利,使得游戏更新更加及时、灵活和高效。但是,在使用热更新技术时需要注意安全性、稳定性以及更新管理等问题。只有做好这些方面的工作,才能实现热更新技术的最佳效果。

Asklyw的博客 2109

【顾邦小讲堂】第十九期 RC Snubber吸收电路详解:抑制MOSFET振铃现象与过冲的设计技巧!

通过RC Snubber电路有效抑制MOSFET DS端的过冲及振铃现象,帮助工程师们在设计中提升电路的稳定性和可靠性

GBupupup的博客 3792

【一张图系列】别再混淆了!5分钟搞懂ERP、MES、PLC的职责边界与数据流》

《ERP、MES、PLC系统边界与协作解析》一文清晰阐述了制造业三大核心系统的角色分工与数据流转。文章将ERP比作企业"大脑"负责战略规划,MES作为车间"指挥官"负责执行调度,PLC则是设备"士兵"执行具体操作。通过一张架构图展示了从计划层到控制层的完整信息流:蓝色箭头表示指令下行(ERP→MES→PLC),橙色箭头代表数据上行反馈(PLC→MES→ERP)。文章强调理清系统边界对数字化转型、部门协作和项目实施的关键作用,并预告下期将深入解析ME

「东哥说MES」 专注于MES制造执行系统,为你拆解核心架构、功能模块及与ERP/PLC的集成逻辑。提供从入门到精通的系列干货、精选行业报告与实用工具,构建你的数字化知识体系,关注我,用实战经验照亮你的数字化之路。 976

Unity热更新

要想执行lua文件,就要用上Lua加载器了,修改LuaManager.csusing XLua;// 存放lua文件的位置,Assets根目录下// 请求执行src下的Main.lua文件= null)// 执行Main.lua Start方法.Invoke();// 执行Main.lua Update方法.Invoke();if (!//读取路径下的文件的值以字节形式返回#endif// TODO// android ios 等平台读取lua文件。

099 3626

【matlab】MATLAB 变量详解与应用

在 MATLAB 中,变量可以通过赋值操作进行定义。例如,要定义一个名为xx = 10;在这个例子中,我们创建了一个名为x的变量,并将其赋值为 10。需要注意的是,MATLAB 是一种动态类型语言,因此不需要显式地声明变量的类型。变量名必须以字母开头。变量名可以包含字母、数字和下划线。变量名区分大小写。不要使用 MATLAB 中的关键字(如forif等)作为变量名。

小吴同学的博客 2215

Unity 几种主流的热更新方式

选择合适的热更新方案需要综合考虑项目规模、目标平台、团队技术栈和长期维护成本等因素。:在 Unity Editor 中设置资源的 AssetBundle 属性。大型项目:HybridCLR + AssetBundle。:AssetBundle 或 Addressables。├─ AssetBundle 加载。运行时动态加载更新的 AssetBundle。:运行时加载更新后的 AssetBundle。需要简化 AssetBundle 管理的项目。基于 AssetBundle 的增强方案。

2302_76776557的博客 6633

Python爬虫实战:用BeautifulSoup和Pandas轻松抓取去哪儿网景点数据(附完整代码)

本文详细介绍了如何使用Python的BeautifulSoup和Pandas库构建一个高效的旅游数据爬虫,从去哪儿网抓取景点数据。内容涵盖环境准备、网页结构分析、核心代码实现、反爬策略以及数据清洗与存储,提供完整代码示例,帮助开发者快速掌握数据采集技术。

river的博客 357

7段数码管驱动电路设计

7段数码管驱动电路设计

好好学习,天天向上 9755

Unity热更新-HybirdCLR + Addressable

Unity实现简单远程热更新,使用HybirdCLR + Addressable,然后就不知道说什么了.....

WEIWEI6661012的博客 5306

FPGA 学习笔记:Vitis IDE launch failed 的解决方法

FPGA 学习笔记:Vitis IDE launch failed 的解决方法

坚韧与专注 1万+

U3D热更新技术

🕐:开发者将测试好的代码,发布到应用商店的审核平台,平台方会进行稳定性及性能测试。👉 测试成功后,用户即可在 👉 如苹果的AppStore看到应用的更新信息,用户点击应用更新后,需要先关闭应用,再进行更新。👉 人话:重装🕐:什么是热更新❓🤷‍♂️广义:无需关闭应用,不停机状态下修复漏洞,指软件不通过运营商店的软件版本更新审核,直接通过应用自行下载的软件数据更新资源的行为,重点是更新逻辑代码。

m0_61490399的博客 7179

S7-1200与ABB机器人进行SOCKET通信的具体方法示例

S7-1200与ABB机器人进行SOCKET通信的具体方法示例

Robot_PLC_HMI_Automation 3299

突破限制:巧用Azure OpenAI,畅玩Gemini模型

通过 Azure OpenAI 服务这一巧妙的途径,间接调用 Gemini 模型,打破网络限制的壁垒。本文将详细介绍这一方法,无论你是人工智能领域的新手,还是经验丰富的开发者,都能从中获取实用的技巧,轻松开启 Gemini 模型的探索之旅

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 182

Unity HyBridCLR 热更新

Unity HyBridCLR 实现热更新

qq_44810574的博客 2319

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ILRuntime Unity热更新

在新的项目中,使用到了ILRuntime的热更新方式,不同于XLua等,这种方式的热更新是由纯C#实现的,所以就不需要客户端懂Lua的代码。更详细的介绍可以看官方的文档。 官方的介绍及文档为:http://ourpalm.github.io/ILRuntime/public/v1/guide/index.html 目前大致的理解为:将游戏分为两个部分,Unity和Hotfix。其中主要的游戏逻...

王王王渣渣的博客 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【Unity技术专题】热更新专题、AssetBundle、Addressable、ILRuntime

热更新专题 程序丨入门必看:Unity资源加载及管理 AssetBundle与热更新的科普文 浅谈倩女手游中的资源更新 uLua基础之C#与lua相互调用 AssetBundle入门 【Unity游戏开发】AssetBundle杂记--AssetBundle的二三事 Unity官方AssetBundleDemo 一个不错的热更学习框架 lua热更框架之XLua Unity AssetBundle,Asset,GameObject之间的联系 Unity AssetBundle高效加...

yhx956058885的博客 810

【Unity】热更新框架之xLua

xLua是由腾讯维护的一个开源项目,xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。自2016年初推广以来,已经应用于十多款腾讯自研游戏,因其良好性能、易用性、扩展性而广受好评。现在,腾讯已经将xLua开源到GitHub。

希望有志同道合的的朋友可以互相学习! 8768

【unity游戏开发——热更新】YooAsset+HybridCLR代码热更新实践

《Unity热更新实践:YooAsset与HybridCLR整合方案》 摘要:本文详细介绍了Unity热更新方案中YooAsset与HybridCLR的整合实践。通过YooAsset管理资源加载与更新,配合HybridCLR实现代码热更新。实践内容包括:1)使用YooAsset加载热更新程序集;2)通过反射调用热更新代码;3)特殊处理编辑器模式与打包模式的程序集加载差异;4)完整的热更新资源打包流程(含DLL文件处理);5)本地资源服务器的搭建与资源下载;6)场景切换的实现。文章还强调了关键操作步骤如Hyb

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4778

Unity引擎使用HybridCLR(华佗)热更新

Unity引擎使用HybridCLR(华佗)热更新

阿赵的博客 6391

Unity热更新机制

前言 游戏上线后,难免会有一些测试阶段没发现的bug,bug这东西,可大可小。 如果出现重大bug,而又没有热更技术,那么我们为了修复bug就只能强制玩家去商店下载新包,那造成的玩家流失是非常可怕的。 而如果有热更,我们在发现问题的当天,只需要发布一个小补丁包,就能将问题修复了。 目录 热更新的原理 热更新的基本流程 热更新的原理 Unity游戏热更新包含两个方面,一个是资源的更新,一个是脚本的更新。 Unity提供可以热更的方案就是AssetsBundle(后面简称AB)。资源、代码都可以打成

OntheSnow的博客 1万+

Unity代码热更新和资源热更新

资源热更新是指在应用程序运行时,对游戏或应用的资源(如图片、音频、视频、模型等)进行更新,而无需重新安装整个应用。这在游戏开发中尤为重要,因为游戏资源通常较大,且随着游戏的运营,需要不断更新资源以提供新的内容和优化体验。例如,一款手机游戏需要定期更新角色皮肤、地图场景、剧情动画等资源,通过资源热更新,玩家无需重新下载整个游戏包,就能获取并使用这些新资源。

weixin_46012816的博客 1309

【unity游戏开发——热更新】什么是Unity热更新

Unity游戏开发热更新技术解析 热更新技术允许游戏在不重新发布安装包的情况下远程修复Bug或新增内容,分为资源热更新(贴图、配置等)和代码热更新(逻辑脚本)。资源热更通过AssetBundle、Addressables等方案实现;代码热更因技术限制需借助Lua、ILRuntime或HybridCLR等方案,其中HybridCLR因支持原生C#和高性能成为首选。热更新核心优势包括绕过应用商店审核、快速修复问题及动态扩展内容,是移动端游戏开发的关键技术。开发者可根据项目需求选择组合方案,如Addressabl

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2279

Unity热更新-HybirdCLR + Addressable 一

Unity现在热更新技术都很全面了,本文采用HybirdCLR + Addressable实现代码与资源热更,也参考了Hybird官方案例、以及其他各个大佬写的博客

colooooooo的博客 3367
上一篇: Unity热更新专题(八)uLua示例Demo简析及SimpleFramework工作流程
下一篇: Photon服务器引擎(一)Photon简介
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值