XLua 基础

Posted lk95

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XLua 基础相关的知识,希望对你有一定的参考价值。

一.Lua文件加载

1.Resources文件夹下加载  xxx.lua.txt  文件

        技术分享图片

1.)Resources加载xuaTest文件

 // 1.Resources加载xuaTest文件
        TextAsset ta = Resources.Load<TextAsset>("xluaTest.lua");   //Resources文件夹下文件命名为 xx.lua.txt
        LuaEnv env = new LuaEnv(); //实例化lua环境虚拟机
       // 执行文件中的文本
        env.DoString(ta.text);
        env.Dispose();//销毁虚拟机

技术分享图片

2.)通过loader加载

 LuaEnv env = new LuaEnv();
 env.DoString("require ‘xluaTest‘");
 env.Dispose();

技术分享图片

3.)自定义loader加载<StreamingAssets>

技术分享图片

using XLua;
using System.IO;
public class Lua_CustomLoader : MonoBehaviour {

    // Use this for initialization
    void Start() {
        LuaEnv env = new LuaEnv();
        env.AddLoader(MyLoader);  
env.DoString(
"require ‘xluaTest001"); env.Dispose(); } /// <summary> /// /// </summary> /// <param name="filepath">文件路径名</param> /// <returns>加载器加载的lua文件</returns> public byte[] MyLoader(ref string filepath) { //2.streamingAssets下的lua文件加载 string path = Application.streamingAssetsPath + "/" + filepath + ".lua.txt"; //lua中代码文本转换字节数组 return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path)); }

 技术分享图片

二.C#访问Lua

   在StreamingAssets文件下建立  xluaTest.lua.txt   文本

           技术分享图片

1.)访问lua中的全局变量

using XLua;
using System.IO;
public class Lua_CustomLoader : MonoBehaviour {
    void Start() {
        LuaEnv env = new LuaEnv();
        env.AddLoader(MyLoader);  
        env.DoString("require ‘xluaTest001‘");
        //1.访问lua中的全局变量
        int playerLv = env.Global.Get<int>("lv");
        string playerName = env.Global.Get<string>("playerName");
        bool isDie= env.Global.Get<bool>("isDie");
        Debug.Log(playerLv + "====" + playerName + "====" + isDie);

        env.Dispose();
    }
    /// <param name="filepath">文件路径名</param>
    /// <returns>加载器加载的lua文件</returns>
    public byte[] MyLoader(ref string filepath)
     { 
        //2.streamingAssets下的lua文件加载
        string path = Application.streamingAssetsPath + "/" + filepath + ".lua.txt";
        //lua中代码文本转换字节数组
        return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));
    }
// Update is called once per frame
void Update() {
    } 
}

 

技术分享图片

2.)访问全局的table表

//先建立一个类,与lua中的表对应
class MyPerson
{
    public string name;
    public int age;
    public bool isSingle;
}

   ①    映射到类中, 获取全局table表

// 2. 映射到类中, 获取全局table表
        MyPerson myPerson = env.Global.Get<MyPerson>("Person");
        Debug.Log(myPerson.name + " " + myPerson.age + " " + myPerson.isSingle);

 

     技术分享图片

 ②映射到interface

先建立一个interface  并且要有  [CSharpCallLua]

[CSharpCallLua]
interface IPerson
{
    string name { get; set; }
    int age { get; set; }
    bool isSingle { get; set; }
}

 

//3.映射到interface
   IPerson LLWH = env.Global.Get<IPerson>("Person");
   Debug.Log(LLWH.name + "=======" + LLWH.age + "=======" + LLWH.isSingle);

 

技术分享图片

注意: 这里如果运行的时候报以下错误

技术分享图片

    在unity的菜单栏里面进行操作:找到  XLua----->Clear Generated Code 点击即可

 ③映射到字典Dictionary<>

 // 4. 映射到字典中
        Dictionary<string, object> dict = env.Global.Get<Dictionary<string, object>>("Person");
        foreach (string key in dict.Keys)
        {
            Debug.Log(key + "======>" + dict[key]);
        }

 

    技术分享图片

④映射到 List<> 中

 // 5. 映射到list中
        List<object> list = env.Global.Get<List<object>>("Person");   //用object向上转型
        foreach (object item in list)
        {
            Debug.Log(item);
        }

 

技术分享图片

⑤映射到 luatable 中

 // 6. 映射到luatable中
 LuaTable table = env.Global.Get<LuaTable>("Person");
 print(table.Get<string>("name"));
 print(table.Get<int>("age"));
 print(table.Get<bool>("isSingle"));

 

技术分享图片

 

3.)访问 lua 中的方法

   ①无参

       Action要引用命名空间 using System;

  //1. C#访问方法   无参
        Action func = env.Global.Get<Action>("PrintFunc");//PrintFunc 为lua中的方法名
        func();
        func = null;

技术分享图片

   ②  有参

   首先引入委托

[CSharpCallLua]
delegate int Add(int a, int b);

 

Add func = env.Global.Get<Add>("AddFunc");//AddFunc 为lua中的方法名
        int  result=  func(10,5);
        Debug.Log(result);
        func = null;

技术分享图片

 

三.C#调用Lua

技术分享图片 返回a+b,a-b;

 void Start() {
        LuaEnv env = new LuaEnv();
        env.AddLoader(MyLoader);  
        env.DoString("require ‘xluaTest001‘");
 //C#调用lua方法 使用luafaction
        LuaFunction func = env.Global.Get<LuaFunction>("AddFunc");
        object[] res = func.Call(1, 23);
        foreach (object item in res)
        {
            Debug.Log(item);
        }
        env.Dispose();
    }
    /// <param name="filepath">文件路径名</param>
    /// <returns>加载器加载的lua文件</returns>
    public byte[] MyLoader(ref string filepath)
     { 
        // streamingAssets下的lua文件加载
        string path = Application.streamingAssetsPath + "/" + filepath + ".lua.txt";
        //lua中代码文本转换字节数组
        return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));
    }

 

技术分享图片

四.Lua调用C#

1.) new C#对象

     在C#中new对象:

                    var newGameObj=new UnityEngine.GameObject();

     对应到Lua是这样:

                    local newGameObj = CS.UnityEngine.GameObject()

     基本类似,除了:

   ①lua里面没有new关键字

   ②所有C#相关的都放到CS下,包括构造函数,静态成员属性、方法;

    xlua支持重载,比如你要调用GameObject的带一个string参数的构造函数,这么写:

      local newGameObj2 = CS.UnityEngine.GameObject(‘helloworld‘)

2.) 访问C#静态的属性(调用用" . ")

     Lua:    print( CS.UnityEngine.Time.deltaTime)  

3.)访问C#中静态的方法 调用用("  . ")

local cameraGo = UnityEngine.GameObject.Find(‘Main Camera‘)

4.)访问C#中的成员属性 调用用(" . ")

local cameraCom = cameraGo:GetComponent("BoxCollider")
UnityEngine.GameObject.Destroy(cameraCom)

5.)访问C#中的成员方法 (调用用" : ")

local cameraGo = UnityEngine.GameObject.Find(‘Main Camera‘)
cameraGo:SetActive(false)

 




以上是关于XLua 基础的主要内容,如果未能解决你的问题,请参考以下文章

XLua系列讲解_XLua调用C#

Unity 使用xLua遇到的坑

xLua - 第三方扩展的添加和编译

xLua - 第三方扩展的添加和编译

xlua中hotfix简单实用

XLua的一些官网