博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lua热更框架之XLua
阅读量:7173 次
发布时间:2019-06-29

本文共 2362 字,大约阅读时间需要 7 分钟。

框架介绍
xLua是当下最流行的unity热更方案之一,作者是腾讯的车雄生前辈,自2016年初推出以来,已经在腾讯的多款游戏项目上应用,目前xLua已经开源到了GitHub。xLua最大的特色是不仅支持纯lua脚本热更,更是可以做 C# 代码的bug hotfix,即平时开发时使用C#,项目上线后,如果突然发现有bug,可以直接用lua去修复出bug的地方,原理就是通过[Hotfix]特性标记然后在IL逻辑层判断修改逻辑,使程序去执行更新后的lua逻辑代码而不是走之前的C#逻辑。
 
框架优势
与别的lua热更插件不同的是,别的lua热更方案基本都是项目中需要热更的部分一开始就需要用lua语言去实现,xlua的HotFix出现之前,基本所有的lua热更方案都是如此,这样做的不足之处有:lua的性能是不如C#的,这是最主要的,此外,有些项目刚开始做时都是用C#的,如果已经用C#做完了,这时再去接入lua,把需要逻辑热更的C#代码重新用lua去实现,这样就麻烦了不少,费时费力,而且两种语言配合开发时还容易碰上伤脑筋的bug。使用xlua的HotFix,就可以平时开发用C#
,C#写起来比lua舒服多了吧;运行的时候也是C#,性能也比lua强;可能会出现bug或者需要热更逻辑的地方打上[HotFix]特性标签,然后就下载lua脚本文件更新实现即可,等到下次大版本更新时,再把lua补丁换成正确的C#实现。同时,xlua的易用性更是秒杀其他lua热更插件,在编辑器下无需生成代码,使用简单,不像其他lua热更插件每次更新代码就需要点Code Generate。
 
HotFix使用
xLua的纯lua热更使用方式跟其他lua热更方案大同小异,这里只简单介绍一下HotFix使用。
首先,对于可能出现bug或者后期需要更新逻辑的地方,给这个类加上[HotFix]标签,并在方法上打上[LuaCallCSharp]标签,例如下面这个类,打上[HotFix]标签,CreatePrize()方法上打上[LuaCallCSharp]标签,那么当需要更新这个方法时,只需在lua脚本中重新实现这个方法。

 

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;using XLua;[Hotfix]public class Treasour : MonoBehaviour {    public GameObject gold;    public GameObject diamands;    public Transform cavas;    [LuaCallCSharp]    private void CreatePrize()    {        for (int i = 0; i < 5; i++)        {            GameObject go = Instantiate(gold, transform.position + new Vector3(-10f + i * 30, 0, 0), transform.rotation);            go.transform.SetParent(cavas);            GameObject go1 = Instantiate(diamands, transform.position + new Vector3(0, 30, 0) + new Vector3(-10f + i * 30, 0, 0), transform.rotation);            go1.transform.SetParent(cavas);        }    }}

 

在lua脚本中,如下:
local UnityEngine=CS.UnityEnginexlua.hotfix(CS.Treasour,'CreatePrize',function(self)    for i=0,4,1 do        local go=UnityEngine.GameObject.Instantiate(self.gold,self.transform.position+UnityEngine.Vector3(-10+i*40,0,0),self.transform.rotation)        go.transform.SetParent(go.transform,self.cavas)        local go1=UnityEngine.GameObject.Instantiate(self.diamands,self.transform.position+UnityEngine.Vector3(0,40,0)+UnityEngine.Vector3(-10+i*40,0,0),self.transform.rotation)        go1.transform.SetParent(go1.transform,self.cavas)    endend)

 

当客户端下载lua脚本后,就会自动执行lua中的CreatePrize方法,这样就实现了代码热更。
void Start(){    if(_hotfix)         _lua_CreatePrize;     else          _csharp_CreatePrize;}

 

 
 

转载于:https://www.cnblogs.com/IAMTOM/p/9498393.html

你可能感兴趣的文章
mysql 开发进阶篇系列 36 工具篇mysqlshow(数据库对象查看工具)
查看>>
如何高效的使用PowerShell备份数据库
查看>>
默认的Sublime 3中没有Package Control
查看>>
Axure 7.0百度云盘下载
查看>>
Unity AngryBots愤怒的机器人demo研究
查看>>
Asp.net MVC验证哪些事(2)-- 验证规则总结以及使用
查看>>
js学习1 —— 类型,值,变量
查看>>
Select count(*)、Count(1)、Count(0)的区别和执行效率比较
查看>>
开源SIP服务器OpenSIPS应用介绍
查看>>
数据科学入门 (一) —— 数据
查看>>
Android源码设计模式-中介者模式
查看>>
PWA之推送服务器(koa2+mysql+pm2)
查看>>
XSS Filter Evasion Cheat Sheet 中文版
查看>>
PHPStrom For Mac配置环境
查看>>
聊聊flink的Evictors
查看>>
优化体系结构 - 数据外置减少中间表
查看>>
自学 JAVA 的几点建议
查看>>
微信小程序开发系列四:微信小程序之控制器的初始化逻辑
查看>>
使用 typescript 来写测试
查看>>
Golang学习笔记--函数作为值的使用
查看>>