初学ULua与XLua,在这里简单介绍一下各自特点与使用步骤,若有不当之处,欢迎指正。

一:介绍
ULua与XLua都是用于Unity项目的热更新。
ULua的集成开发环境为SimpleFramework,分为NGUI版和UGUI版。实际上,ULua是对Lua的一次“包装”,而SimpleFramework是对ULua的又一次“包装”。由此可知,其关系为SimpleFramework>ULua>Lua。ULua本身已经写好了框架,需要开发者在游戏的开发阶段就要确定好哪些部分需要使用Lua脚本编写,这样如果在游戏发布以后发现了Bug,或者需要更新部分内容,可以很方便地进行热更新。
而XLua是腾讯的一个开源项目,它在开发阶段十分便捷,脚本可以都用C#来编写,但是若想进行热更新是十分麻烦的,可能很小的地方需要在Lua脚本重写大量的代码。

二:使用步骤
①ULua(此处以NGUI版本为例)
1.将SimpleFramework载入Unity项目。而SimpleFramework是在Unity5.0.0版本下打包的,当用更高项目的Unity时需要对项目进行”Upgrade”。API的升级请求也要点击同意。
2.修复两个obsolete错误,会有相关提示。
3.Lua->Gen Lua Wrap File生成Wrap文件。(此类脚本是对Unity中常用组件的二次包装,Lua运行后,会把Wrap文件加载到Lua运行环境中。使得Lua调用Wrap文件,Wrap调用C#,间接地实现Lua调用C#。Wrap文件可以提高lua的执行效率。其位置为uLua\Source\Lua\Wrap)
4.Game->Build X Resource。生成的AssetBundle文件会放在StreamingAsset文件夹下,生成的过程中还会把Lua文件夹下的所有脚本复制到该目录。
5.ULua与C#交互:
a:
C#代码中执行Lua代码:
LuaState lua = new LuaState();
lua.DoString(“print(‘Goodbye’)”);
<1>在C#中引入LuaInterface;
Lua中操作Unity的类:
luanet.load_assembly(‘UnityEngine’)
GameObject = luanet.import_type(‘UnityEngine.GameObject’)
BoxCollider = luanet.import_type(‘UnityEngine.BoxCollider’)
local player = GameObject(‘King’)
player:AddComponent(luanet.ctype(BoxCollider))
<1>luanet已经被封装到LuaInterface命名空间内,在Lua代码中可以直接使用此对象
<2>Lua中操作C#的类创建对象,不写new
<3>Lua中C#的类所创建的对象,访问对象中的方法要用冒号
b:
Lua代码中操作Unity内的类(wrap方式):
luanet.load_assembly(‘UnityEngine’)
GameObject = UnityEngine.GameObject
BoxCollider = UnityEngine.BoxCollider
local player = GameObject(‘King’)
player:AddComponent(BoxCollider.GetClassType())
C#中:
LuaScriptMgr lua = new LuaScriptMgr();
lua.Start();
<1>要把AppConst.cs中的DebugMode修改为true
<2>使用Wrap方式时,运行Lua代码用的是LuaScriptMgr。用这种方式实现Lua调用C#,依赖的是之前生成的LuaWrap文件。因此,当我们要操作的脚本没有生成XXXWrap脚本时,如果我们如此操作:打开uLua\Editor\WrapFile.cs->添加_GT(typeof(类名)) ->Clear LuaBinder File + Wrap File -> Gen Lua Wrap Files
6.正式项目开发时,Appconst.cs中的ExampleMode修改为false,也就可以把Example文件夹删除掉了。DebugMode = false, UpdateMode = true, AppName = “项目名称”。webUrl要与服务器端ip地址保持一直。
7.设置预制体的AssetLabels信息,后缀设置为assetbundle。在Packager.cs脚本中对于Appconst.ExampleMode为假的情况下进行处理,让脚本可以打包所有指定了AssetBundle信息的物体。(在打包资源的时候如果出现了LuaWrap文件夹下的脚本错误,先清空LuaWrap文件,生成AB资源,再生成LuaWrap文件)
8.从服务器端下载资源
<1>Web网站方式,前面已经介绍过了
<2>Socket方式:
VS打开Service\HttpServer.cs,配置15行中的host为服务器的ip,28行为服务器给客户端资源的存放地址。点击生成->生成解决方案。
9.场景中创建一个空物体,挂载”GlobalGenerator.cs”脚本,作为框架的入口。
10.打包项目后,修改lua脚本,重新生成AB资源,就可以完成热更新啦!

②XLua
1.将XLua中的Plugins和XLua文件夹拷贝到该项目中
2.C#调用Lua
<1>using XLua;
<2>创建运行Lua代码的虚拟机(出于开销考虑,建议只创建一个)
LuaEnv luaEnv = new LuaEnv();
luaEnv.DoString(“print(‘mkcode’)”);
3.调用外部Lua文件
<1>在Resources文件夹下创建后缀为txt的lua文件。eg:fileName.lua.txt
<2>luaEnv.DoString(“require ‘fileName’”);
<3>C#获取Lua数据
luaEnv.Global.Get(“a”);
luaEnv.Global.Get(“b”);
4.Lua调用C#
需要在C#的命名空间前加上”CS.”
获取C#中的类:CS.UnityEngine.GameObject
获取C#中的方法:CS.UnityEngine.GameObject.Find()
获取C#的字段:若是public,可直接用self.字段名访问;若为private,可用代码获取访问权xlua.private_accessible(CS.类名)
5.环境初始化:
a.File->Build Settings->Player Settings->Configuration
修改Scripting Define Symbols: HOTFIX_ENABLE
b.XLua->Generate Code
生成Wrap文件,存放在XLua/Gen处
c.XLua->Hotfix Injcet In Editor
如果出现”please install the Tools”的error,需要把Tools文件夹拷贝到与Asset同级的位置。每次修改完C#文件都要重新注入一次。
6.HotFix特性标签
a.在开发阶段时,以后可能需要热补丁修复的类要在其头部添加[HotFix],同时using Xlua;
b.lua代码中的HotFix语法:
xlua.hotfix(CS.className, ‘functionName’, luaFucntion)
eg1:
xlua.hotfix(CS.Test, ‘Hello’, function()
print(‘Lua Goodbye~’)
end)
eg2.
xlua.hotfix(CS.Test, ‘Add’, function(self, a, b)
print(a + b)
end)
注:有参方法需要传递当前脚本对象,即此处的self
7.在一个启动场景中创立一个空物体HotFixManager,同时挂载同名脚本,脚本内定义LuaEnv虚拟机,用于热更新。至于HotFixManager的编写,就不再此处详述了。
8.创建StreamingAssets文件夹,使用WWW类加载该文件夹下的资源。

总算是大体整理完成了,可能在某些方面还会有些小错误,若是发现再改正,还需要继续学习lua。不过这一阶段结束之后就可以转入其他课程了~

Unity3d之ULua与XLua应用相关推荐

  1. unity3d导入xlua

    一.xLua下载地址 腾讯开源的xlua地址:https://github.com/Tencent/xLua/ 二.如何在unity3d中导入xLua xLua下载后,目录如下 新建unity3d工程 ...

  2. Lua快速入门篇(基础概述)(Yanlz+toLua+xLua)

    <Lua热更新> ##<Lua热更新>发布说明: ++++"Lua热更新"开始了,立钻哥哥终于开始此部分的探索了. ++++作为游戏发布迭代的重要技术:Lu ...

  3. ulua、tolua原理解析

    在聊ulua.tolua之前,我们先来看看Unity热更新相关知识. 什么是热更新 举例来说: 游戏上线后,玩家下载第一个版本(70M左右或者更大),在运营的过程中,如果需要更换UI显示,或者修改游戏 ...

  4. x-studio(Lua调试器,粒子编辑器,UI编辑器,代码编辑器,csb恢复工具)

    最新版本:x-studio 10.0.9000.29(2020年4月14日更新) 官网: https://x-studio.net 官方教程: https://docs.x-studio.net x- ...

  5. 【游戏客户端与服务器面试题】-- 2022年最新游戏客户端与服务器面试(lua篇持续更新)

    [游戏客户端与服务器面试题干货]-- 2022年度最新游戏客户端面试干货(lua篇) 文章目录 一.Lua的8种数据类型 (1) nil 类型 (2) boolean类型 (3) number类型 1 ...

  6. Unity3D 基于XLua框架实现Lua组件化开发方式(一)----基于C#调用Lua

    众所周知Unity的开发语言是C#,并不支持Lua语言,为了解决这一问题出现了诸如Xlua.ULua.ToLua等框架来让unity支持lua,由于为了应对众多游戏经常需要解决的热更新问题,出了两种主 ...

  7. Unity3D手游项目的总结和思考(6) - Xlua的使用心得

    有一个项目做完快上线了,不是lua写的,能热更新的东西就特别少,如果遇到bug也很难在第一时间热修复,所以我就接入了Xlua这个插件点击打开链接 原本只是想热修复一下的,后来领导要求把逻辑系统的C#代 ...

  8. Unity3D 学习笔记4 —— UGUI+uLua游戏框架

    Unity3D 学习笔记4 -- UGUI+uLua游戏框架 使用到的资料下载地址以及基础知识 框架讲解 拓展热更过程 在这里我们使用的是uLua/cstolua技术空间所以提供的UGUI+uLua的 ...

  9. unity3d热更新插件uLua

    转自:http://blog.sina.com.cn/s/blog_930ffa0b0102vbat.html 前言 IOS不能热更新,不是因为不能用反射,是因为 System.Reflection. ...

最新文章

  1. 实例化Layout中的布局文件(xml)
  2. Mysql根据日期查询
  3. HDUOJ----剪花布条
  4. linux常用命令之权限
  5. Pytorch 加载和保存模型
  6. *【ZOJ - 3604】Tunnel Network (Cayley定理,purfer数列,无根树定理,构造,结论,或dp)
  7. 你真的理解图像处理算法SIFT吗?
  8. SESSIONS.ser 的问题
  9. Spring : Spring容器之SmartLifeCycle的简单使用
  10. C# dataTable实用例
  11. 高数习题第七章总练习题(下)
  12. 【逆向】Android逆向破解某APP
  13. 博客外链应该要怎么养
  14. c 程序语言的溢出错误,C语言中溢出错误分析和防范
  15. (附源码)springboot大学生就业质量调查分析系统 毕业设计161457
  16. 用python画微笑脸表情_python画表情包
  17. html,css和js
  18. MySQL 查看表结构 显示表内容 使用语句区别
  19. Simulink Data Type Conversion模块使用笔记
  20. 新古典增长理论和内生增长理论的小总结

热门文章

  1. mysql可以做决策树吗_决策树 - stream886 - 博客园
  2. 使用 MATLAB 编程,设计一个数字锁相环,用于数字通信系统同步, 并给出仿真结果
  3. 九宫格 数独二进制解法
  4. 树莓派上Python实现TSL2561采样光照强度
  5. 克莱因瓶计算机模拟,世界未解之谜:神奇的克莱因瓶永远装不满水,它或存在于四维空间?...
  6. U盘安装centos遇到bootmgr is missing
  7. 基于vue练习demo:发表评论案例 (使用localStorage存储数据)
  8. 关于RF框架的一些整理
  9. 高压电源模块5V/12V/24V升90V/200V/450V/900V升压电路
  10. echarts怎么实现立体柱状图_在vue项目中使用echarts制作3d柱状图