前段时间学习了XLua的教程,发现非常的好用,下面用一个简单的例子来使用一下Xlua,将一个加法运算的程序 热更新成减法运算
首先,我们写一个简单的加法运算
-
using System;
-
using System.Collections;
-
using System.Collections.Generic;
-
using System.Text;
-
using UnityEngine;
-
using UnityEngine.UI;
-
using XLua;
-
-
public
class
XluaText :
MonoBehaviour {
-
public Text EditionText;
//显示版本
-
public Text Operator;
//运算符
-
public Text Anser;
//结果
-
public InputField input1;
//第一个数据
-
public InputField input2;
//第二个数据
-
-
private void Start()
-
{
-
-
Init();
-
}
-
-
public void Init()
-
{
-
Debug.LogError(
"第一个版本初始化");
-
}
-
-
public void Add()
-
{
-
int num =
int.Parse(input1.text) +
int.Parse(input2.text);
-
Anser.text =
"= " + num.ToString();
-
}
-
-
}
然后在Unity编辑器中给相应的UI赋值,将脚本绑定在Canvas画布上,并将画布名改名为GamePanel,效果如下图:
运行后也很简单:
好了 ,我们现在开始进行热更的步骤 :
一丶先在Scripting Dfeine Symbols中加入HOTFIX_ENABLE标签
选择Edit->Project Setting->Player 右边Inspector列表中
加入HOTFIX_ENABLE标签
二丶在要修改的类前加上[Hotfix]
-
[
Hotfix]
-
public
class
XluaText :
MonoBehaviour
三丶开始编写Lua脚本
-
xlua.hotfix(CS.XluaText,
'Init',function(
self)
-
self.EditionText.text =
'版本2'
-
self.Operator.text =
'-'
-
end)
-
-
xlua.hotfix(CS.XluaText,
'Add',function(
self)
-
local num = tonumber(
self.input1.text) - tonumber(
self.input2.text)
-
self.Anser.text =
"= "..tostring(num);
-
end)
hofix函数的3个参数分别为:需要修改的类,修改的函数名,函数类。
该lua脚本实现的功能是修改Init函数,把EditionText修改成“版本2”,把Operator的Text修改成“-”号
再修改Add脚本 将加法运算修改成减法运算。
保存该lua脚本名为XluaText1.lua。
四丶编写调用Lua脚本的类
-
using System.Collections;
-
using System.Collections.Generic;
-
using System.Text;
-
using UnityEngine;
-
using XLua;
-
-
public
class
HotFixText :
MonoBehaviour
-
{
-
LuaEnv m_kLuaEnv;
-
-
public GameObject gamepanel;
-
public GameObject Downpanel;
-
-
void Start ()
-
{
-
//代码热更步骤
-
m_kLuaEnv =
new LuaEnv();
//该变量最好保证全局就此一个
-
-
//查找指定路径下lua热更文件
-
string path = Application.persistentDataPath +
"/XluaText1.lua.txt";
-
//用协程序下载读取文件内容
-
StartCoroutine(DownloadFile(path));
-
}
-
-
public IEnumerator DownloadFile(string path)
-
{
-
WWW www =
new WWW(path);
-
yield
return www;
-
if (www.isDone)
-
{
-
System.IO.StreamReader sr =
new System.IO.StreamReader(path, Encoding.UTF8);
-
if (sr !=
null)
-
{
-
//执行该Lua脚本中的语句
-
m_kLuaEnv.DoString(sr.ReadToEnd());
-
}
-
}
-
gamepanel.SetActive(
true);
-
Downpanel.SetActive(
false);
-
}
-
}
如果读取路径下有XluaText1.lua文件时 则执行lua脚本中的内容,没有则正常运行。
这里将2个gameobject的进行了激活和非激活设置,是简单为了体现出更新的效果。如图所示:
GamePanel就是之前做好的计算加法的画布,先设置为false,新添加的DownPanel画布就是一个背景和一个Text而已
将HotFixText 脚本绑定在摄像机上并将2个gameobject赋值
注:要先将该脚本的Enable设置成False,当执行完下载文件的脚本后用动态激活
五丶编写从网络上下载文件的类,已达到热更的效果
-
using System.Collections;
-
using System.Collections.Generic;
-
using System.IO;
-
using UnityEngine;
-
using UnityEngine.UI;
-
-
public
class
WWWText :
MonoBehaviour {
-
-
string urlPath =
"ftp://192.168.1.173/XluaText1.lua.txt";
//资源网络路径(根据自己的服务器来写)
-
string file_SaveUrl;
//资源保路径
-
FileInfo file;
-
-
void Start()
-
{
-
file_SaveUrl = Application.persistentDataPath +
"/XluaText1.lua.txt";
-
file =
new FileInfo(file_SaveUrl);
-
-
StartCoroutine(DownFile(urlPath));
-
}
-
///
-
/// 下载文件到对应的地址
-
///
-
IEnumerator DownFile(string url)
-
{
-
WWW www =
new WWW(url);
-
yield
return www;
-
if (www.isDone)
-
{
-
-
Debug.Log(
"下载完成");
-
-
byte[] bytes = www.bytes;
-
CreatFile(bytes);
-
//下载完成并创建脚本后调用热更新脚本
-
this.GetComponent
().enabled =
true;
-
}
-
}
-
///
-
/// 创建文件
-
///
-
///
-
void CreatFile(byte[] bytes)
-
{
-
Stream stream;
-
stream = file.Create();
-
stream.Write(bytes,
0, bytes.Length);
-
stream.Close();
-
stream.Dispose();
-
}
-
}
将服务器中上传的lua文件 下载到Application.persistentDataPath中,在激活HotFixText脚本进行读取,实现热更新
该脚本也绑定到摄像机上,为了动态开启HotFixText脚本。
注:这里的网络路径可以自己将电脑做成一个简单的服务器,我这里就是把E盘做成了服务器,然后将XluaText1.lua放进了E盘的根目录下。关于把电脑做成服务器的方法可以查阅此网页
https://jingyan.baidu.com/article/af9f5a2d79f49a43150a4540.html
六丶编辑器中测试和打包注意
在Unity编辑器中测试时,要先选择工具栏中的XLua——>Generate Code,然后XLua——>Hotfix Inject In Editor 就可以进行测试了
先正常运行一遍
跟之前一样,由于路径中没有找到对应的lua脚本 所以没有进行下载和热更
Init也是打印了函数中对应的Debug,运算也还是加法
现在,我向我之前设置的服务器地址上传XluaText1.lua脚本。
之前我是将F盘的这个文件夹设置成了服务器的地址 所以直接将lua脚本拖进来就可以了。
再次运行
经常一段时间的Download,下载完成后,画布切换实现了热更,版本1变成了版本2,。
之前的Init初始化打印也没了,输入2个数字进行计算 也变成了Lua脚本中对应的减法运算
一个简单的Xlua项目就完成了!我现在也刚开始初学Xlua中,如果文章中有什么错误和问题希望大家能及时告诉我!谢谢