Unity3d中XLua简单运用

原文链接: https://blog.csdn.net/whitebreeze/article/details/82910479

前段时间学习了XLua的教程,发现非常的好用,下面用一个简单的例子来使用一下Xlua,将一个加法运算的程序 热更新成减法运算

首先,我们写一个简单的加法运算


   
   
   
   
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using UnityEngine;
  6. using UnityEngine.UI;
  7. using XLua;
  8. public class XluaText : MonoBehaviour {
  9. public Text EditionText; //显示版本
  10. public Text Operator; //运算符
  11. public Text Anser; //结果
  12. public InputField input1; //第一个数据
  13. public InputField input2; //第二个数据
  14. private void Start()
  15. {
  16. Init();
  17. }
  18. public void Init()
  19. {
  20. Debug.LogError( "第一个版本初始化");
  21. }
  22. public void Add()
  23. {
  24. int num = int.Parse(input1.text) + int.Parse(input2.text);
  25. Anser.text = "= " + num.ToString();
  26. }
  27. }

然后在Unity编辑器中给相应的UI赋值,将脚本绑定在Canvas画布上,并将画布名改名为GamePanel,效果如下图:

Unity3d中XLua简单运用_第1张图片

Unity3d中XLua简单运用_第2张图片

运行后也很简单:

Unity3d中XLua简单运用_第3张图片

好了 ,我们现在开始进行热更的步骤 :

一丶先在Scripting Dfeine Symbols中加入HOTFIX_ENABLE标签

选择Edit->Project Setting->Player  右边Inspector列表中

Unity3d中XLua简单运用_第4张图片

加入HOTFIX_ENABLE标签

二丶在要修改的类前加上[Hotfix]


   
   
   
   
  1. [ Hotfix]
  2. public class XluaText : MonoBehaviour

三丶开始编写Lua脚本


   
   
   
   
  1. xlua.hotfix(CS.XluaText, 'Init',function( self)
  2. self.EditionText.text = '版本2'
  3. self.Operator.text = '-'
  4. end)
  5. xlua.hotfix(CS.XluaText, 'Add',function( self)
  6. local num = tonumber( self.input1.text) - tonumber( self.input2.text)
  7. self.Anser.text = "= "..tostring(num);
  8. end)

hofix函数的3个参数分别为:需要修改的类,修改的函数名,函数类。

该lua脚本实现的功能是修改Init函数,把EditionText修改成“版本2”,把Operator的Text修改成“-”号

再修改Add脚本 将加法运算修改成减法运算。

保存该lua脚本名为XluaText1.lua。

四丶编写调用Lua脚本的类


   
   
   
   
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using UnityEngine;
  5. using XLua;
  6. public class HotFixText : MonoBehaviour
  7. {
  8. LuaEnv m_kLuaEnv;
  9. public GameObject gamepanel;
  10. public GameObject Downpanel;
  11. void Start ()
  12. {
  13. //代码热更步骤
  14. m_kLuaEnv = new LuaEnv(); //该变量最好保证全局就此一个
  15. //查找指定路径下lua热更文件
  16. string path = Application.persistentDataPath + "/XluaText1.lua.txt";
  17. //用协程序下载读取文件内容
  18. StartCoroutine(DownloadFile(path));
  19. }
  20. public IEnumerator DownloadFile(string path)
  21. {
  22. WWW www = new WWW(path);
  23. yield return www;
  24. if (www.isDone)
  25. {
  26. System.IO.StreamReader sr = new System.IO.StreamReader(path, Encoding.UTF8);
  27. if (sr != null)
  28. {
  29. //执行该Lua脚本中的语句
  30. m_kLuaEnv.DoString(sr.ReadToEnd());
  31. }
  32. }
  33. gamepanel.SetActive( true);
  34. Downpanel.SetActive( false);
  35. }
  36. }

如果读取路径下有XluaText1.lua文件时 则执行lua脚本中的内容,没有则正常运行。

这里将2个gameobject的进行了激活和非激活设置,是简单为了体现出更新的效果。如图所示:

Unity3d中XLua简单运用_第5张图片

GamePanel就是之前做好的计算加法的画布,先设置为false,新添加的DownPanel画布就是一个背景和一个Text而已

将HotFixText 脚本绑定在摄像机上并将2个gameobject赋值

Unity3d中XLua简单运用_第6张图片

注:要先将该脚本的Enable设置成False,当执行完下载文件的脚本后用动态激活

五丶编写从网络上下载文件的类,已达到热更的效果


   
   
   
   
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using UnityEngine;
  5. using UnityEngine.UI;
  6. public class WWWText : MonoBehaviour {
  7. string urlPath = "ftp://192.168.1.173/XluaText1.lua.txt"; //资源网络路径(根据自己的服务器来写)
  8. string file_SaveUrl; //资源保路径
  9. FileInfo file;
  10. void Start()
  11. {
  12. file_SaveUrl = Application.persistentDataPath + "/XluaText1.lua.txt";
  13. file = new FileInfo(file_SaveUrl);
  14. StartCoroutine(DownFile(urlPath));
  15. }
  16. ///
  17. /// 下载文件到对应的地址
  18. ///
  19. IEnumerator DownFile(string url)
  20. {
  21. WWW www = new WWW(url);
  22. yield return www;
  23. if (www.isDone)
  24. {
  25. Debug.Log( "下载完成");
  26. byte[] bytes = www.bytes;
  27. CreatFile(bytes);
  28. //下载完成并创建脚本后调用热更新脚本
  29. this.GetComponent().enabled = true;
  30. }
  31. }
  32. ///
  33. /// 创建文件
  34. ///
  35. ///
  36. void CreatFile(byte[] bytes)
  37. {
  38. Stream stream;
  39. stream = file.Create();
  40. stream.Write(bytes, 0, bytes.Length);
  41. stream.Close();
  42. stream.Dispose();
  43. }
  44. }

将服务器中上传的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 就可以进行测试了

先正常运行一遍

Unity3d中XLua简单运用_第7张图片

跟之前一样,由于路径中没有找到对应的lua脚本 所以没有进行下载和热更

Init也是打印了函数中对应的Debug,运算也还是加法

现在,我向我之前设置的服务器地址上传XluaText1.lua脚本。

Unity3d中XLua简单运用_第8张图片

之前我是将F盘的这个文件夹设置成了服务器的地址 所以直接将lua脚本拖进来就可以了。

再次运行

Unity3d中XLua简单运用_第9张图片

经常一段时间的Download,下载完成后,画布切换实现了热更,版本1变成了版本2,。

之前的Init初始化打印也没了,输入2个数字进行计算 也变成了Lua脚本中对应的减法运算

一个简单的Xlua项目就完成了!我现在也刚开始初学Xlua中,如果文章中有什么错误和问题希望大家能及时告诉我!谢谢

你可能感兴趣的:(Lua)