• XLua教程(一)Lua文件加载


    Lua文件加载

    1. 执行字符串

      最基本是直接用LuaEnv.DoString执行一个字符串,当然,字符串得符合Lua语法
      比如:

      
      /* C# Code */
      using UnityEngine;
      using System.Collections;
      using XLua;
      
      namespace Tutorial
      {
          public class ByString : MonoBehaviour
          {
              LuaEnv luaenv = null;
              // Use this for initialization
              void Start()
              {
                  luaenv = new LuaEnv();
                  luaenv.DoString("print('hello world')");
              }
      
              // void Update()
              // {
              //     if (luaenv != null)
              //     {
              //         luaenv.Tick();
              //     }
              // }
      
              // void OnDestroy()
              // {
              //     luaenv.Dispose();
              // }
          }
      }
      
      

      但这种方式并不建议,更建议下面介绍这种方法。

    2. 加载Lua文件

      用lua的require函数即可
      比如:

      
      /* C#Code */
      using UnityEngine;
      using System.Collections;
      using XLua;
      
      namespace Tutorial
      {
          public class ByFile : MonoBehaviour
          {
              LuaEnv luaenv = null;
      
              void Start()
              {
                  luaenv = new LuaEnv();
                  luaenv.DoString("require 'byfile'"); // 输出 “hello world”
              }
      
              // void Update()
              // {
              //     if (luaenv != null)
              //     {
              //         luaenv.Tick();
              //     }
              // }
      
              // void OnDestroy()
              // {
              //     luaenv.Dispose();
              // }
          }
      }
      
      
      /* LuaCode */
      // Resources/byfile.lua.txt
      // Resources只支持有限的后缀所以要加个其他后缀,如txt
      print('hello world')
      

      require实际上是调一个个的loader去加载,有一个成功就不再往下尝试,全失败则报文件找不到。

      目前 xLua 除了原生的 loader 外,还添加了从 Resource 加载的 loader,需要注意的是因为 Resource 只支持有限的后缀,放 Resources 下的 lua 文件得加上 txt 后缀。

      建议的加载 Lua 脚本方式是:
      整个程序就一个 DoString("require 'main'"),然后在 main.lua 加载其它脚本(效果类似 Lua 脚本的命令行执行: lua main.lua)。

      有童鞋会问:
      要是我的 Lua 文件是下载回来的,或者某个自定义的文件格式里头解压出来,或者需要解密等等,怎么办?
      问得好,xLua 的自定义 Loader 可以满足这些需求。

    3. 自定义 Loader

      在 xLua 加自定义 loader 是很简单的,只涉及到一个接口:

      
          public delegate byte[] CustomLoader(ref string filepath);
          // LuaEnv.AddLoader(CustomLoader loader)
      
      

      通过 AddLoader 可以注册个回调,该回调参数是字符串,lua 代码里头调用 require 时,参数将会透传给回调,回调中就可以根据这个参数去加载指定文件.
      如果需要支持调试,需要把 filepath 修改为真实路径传出。该回调返回值是一个 byte 数组,如果为空表示该 loader 找不到,否则则为 lua 文件的内容。

      透传消息,就是消息体格式及内容,对于传递的通道来说是不去过问的,通道只负责消息的传递,对消息不做任何处理,当客户端接收到透传消息后,由客户端自己来决定如何处理消息。

      有了这个就简单了,用 IIPS 的 IFS?
      没问题。写个 loader 调用 IIPS 的接口读文件内容即可。文件已经加密?没问题,自己写 loader 读取文件解密后返回即可。。。

      完整示例见

          /* C# Code */
          using UnityEngine;
          using XLua;
      
      
          public class ChangeHelloWorld : MonoBehaviour
          {
              LuaEnv luaEnv = null;
              void Start()
              {
                  this.luaEnv = new LuaEnv();
                  // 1)使用 LuaEnv 的 AddLoader 添加一个回调函数
                  this.luaEnv.AddLoader(this.loadedLua);
                  // 2)lua 中用 require 加载 lua 文件
                  // 3)lua 的 每一次require 操作不管是否成功都会触发1的回调
                  this.luaEnv.DoString("require 'luaFile001'");
                  Debug.Log(this.luaEnv.Global.Get<string>("b")); // 输出 bbbb
                  Debug.Log(this.luaEnv.Global.Get<string>("c")); // 输出 null,回调函数里覆盖了lua的内容。c的赋值没了。。
              }
      
              /// <summary>
              /// 加载Lua脚本的回调
              /// </summary>
              /// <param name="fileName">要加载的Lua脚本名字</param>
              /// <returns>加载到的Lua脚本</returns>
              byte[] loadedLua(ref string fileName)
              {
                  if (fileName == "luaFile001")
                  {
                      string script = "b = 'bbbb'";
                      return System.Text.Encoding.UTF8.GetBytes(script);
                  }
                  return null; 
              }
      
              // void Update()
              // {
              //     if (luaEnv != null)
              //     {
              //         this.luaEnv.Tick();
              //     }
              // }
      
              // private void OnDestroy()
              // {
              //     this.luaEnv.Dispose();
              // }
          }
      
      
      /* LuaCode */
      c = 'cccc'
      
  • 相关阅读:
    第七周作业
    人月神话之没有银弹
    第六周作业
    第五周作业
    第四周作业
    第三周作业
    人月神话之沟通
    第二周作业
    第一周作业
    第八周作业
  • 原文地址:https://www.cnblogs.com/sweetXiaoma/p/12336539.html
Copyright © 2020-2023  润新知