找回密码
 立即注册
查看: 252|回复: 0

Unity3d中XLua简单运用

[复制链接]
发表于 2021-8-11 12:12 | 显示全部楼层 |阅读模式
前段时间学习了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));    }    /// <summary>    /// 下载文件到对应的地址    /// </summary>    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<HotFixText>().enabled = true;        }    }    /// <summary>    /// 创建文件    /// </summary>    /// <param name="bytes"></param>    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中,如果文章中有什么错误和问题希望大家能及时告诉我!谢谢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 04:52 , Processed in 0.099432 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表