载入Lua脚本

一、通过文件

  1. using UnityEngine;
  2. using System.Collections;
  3. using XLua;
  4. public class ByFile : MonoBehaviour {
  5. LuaEnv luaenv = null;
  6. void Start()
  7. {
  8. luaenv = new LuaEnv();
  9. // 使用默认loader加载Resources下的"byfile.lua.txt"文件
  10. luaenv.DoString("require 'byfile'");
  11. }
  12. void Update()
  13. {
  14. if (luaenv != null)
  15. {
  16. luaenv.Tick();
  17. }
  18. }
  19. void OnDestroy()
  20. {
  21. luaenv.Dispose();
  22. }
  23. }

byfile.lua.txt存放在Resources文件夹下

  1. print('hello world')

二、通过字符串

  1. /*
  2. * created by shenjun
  3. */
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using UnityEngine;
  7. /*
  8. * 1、引入命名空间
  9. */
  10. using XLua;
  11. namespace shenjun
  12. {
  13. public class ByString : MonoBehaviour {
  14. LuaEnv luaEnv = new LuaEnv();
  15. [Multiline(10)]
  16. public string luaStr1 =
  17. @"function Show(...)
  18. local t = {...}
  19. for i=1,#t do
  20. print(t[i])
  21. end
  22. end
  23. Show(5,3,4,1,2)";
  24. [Multiline(10)]
  25. public string luaStr2 =
  26. @"function GetResult()
  27. return 1, '2'
  28. end
  29. return GetResult()";
  30. void Start () {
  31. // public object[] DoString(string chunk, string chunkName = "chunk", LuaTable env = null)
  32. // 参数1: Lua代码
  33. // 参数2: 发生error时debug显示信息时使用,指明某某代码块的某行错误
  34. // 参数3: 为这个代码块
  35. // 返回值:Lua代码的返回值
  36. // 执行Lua代码
  37. luaEnv.DoString("print('Hello World!')");
  38. luaEnv.DoString(luaStr1);
  39. object[] results = luaEnv.DoString(luaStr2);
  40. if(results != null)
  41. {
  42. foreach (var item in results)
  43. {
  44. Debug.Log(item);
  45. }
  46. }
  47. }
  48. void Update () {
  49. if(luaEnv != null)
  50. {
  51. // 清除Lua未手动调用的LuaBase(比如LuaTable,LuaFunction),及其他一些事情。
  52. // 需要定期调用。
  53. luaEnv.Tick();
  54. }
  55. }
  56. private void OnDestroy()
  57. {
  58. luaEnv.Dispose();
  59. }
  60. }
  61. }

三、通过加载器

Example01 :

  1. using UnityEngine;
  2. using System.Collections;
  3. using XLua;
  4. public class CustomLoader : MonoBehaviour {
  5. LuaEnv luaenv = null;
  6. void Start()
  7. {
  8. luaenv = new LuaEnv();
  9. luaenv.AddLoader((ref string filename) => {
  10. if (filename == "InMemory")
  11. {
  12. string script = "return {ccc = 9999}";
  13. return System.Text.Encoding.UTF8.GetBytes(script);
  14. }
  15. return null;
  16. });
  17. luaenv.DoString("print('InMemory.ccc=', require('InMemory').ccc)");
  18. }
  19. void Update()
  20. {
  21. if (luaenv != null)
  22. {
  23. luaenv.Tick();
  24. }
  25. }
  26. void OnDestroy()
  27. {
  28. luaenv.Dispose();
  29. }
  30. }

Example02 :

  1. /*
  2. * created by shenjun
  3. */
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using UnityEngine;
  7. using System.IO;
  8. using XLua;
  9. namespace shenjun
  10. {
  11. public class ByLoader : MonoBehaviour {
  12. LuaEnv luaEnv = new LuaEnv();
  13. void Start () {
  14. // 注册自定义loader
  15. luaEnv.AddLoader((ref string filePath)=>{
  16. string path = Application.dataPath + "/LessonXLua_shenjun/01_LoadLuaScript/03_ByLoader/" + filePath + ".lua.txt";
  17. if(File.Exists(path))
  18. {
  19. string text = "";
  20. using (StreamReader sr = new StreamReader(path))
  21. {
  22. try
  23. {
  24. text = sr.ReadToEnd();
  25. }
  26. catch(System.Exception ex)
  27. {
  28. Debug.LogError("ReadFile Error :" + path + "; ErrorMsg :" + ex.Message);
  29. return null;
  30. }
  31. }
  32. return System.Text.Encoding.UTF8.GetBytes(text);
  33. //byte[] buffer;
  34. //using(FileStream fsReader = new FileStream(path, FileMode.Open, FileAccess.Read))
  35. //{
  36. // buffer = new byte[fsReader.Length];
  37. // try
  38. // {
  39. // fsReader.Read(buffer, 0, (int)fsReader.Length);
  40. // return buffer;
  41. // }
  42. // catch
  43. // {
  44. // return null;
  45. // }
  46. //}
  47. }
  48. else
  49. {
  50. return null;
  51. }
  52. });
  53. // 如果注册了自定义的loader,会先查找自定义loader,如果自定义loader返回null,则会使用默认loader,如果默认loader也没找到,则报错。
  54. luaEnv.DoString("require 'byloader'");
  55. }
  56. void Update () {
  57. if(luaEnv != null)
  58. {
  59. luaEnv.Tick();
  60. }
  61. }
  62. private void OnDestroy()
  63. {
  64. luaEnv.Dispose();
  65. }
  66. }
  67. }

byloader.lua.txt

  1. print('byCustomLoader: hello world')

?