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

XLua 基础

[复制链接]
发表于 2021-8-14 17:33 | 显示全部楼层 |阅读模式
一.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;publicclass Lua_CustomLoader : MonoBehaviour {    // Use this for initializationvoid Start() {        LuaEnv env = new LuaEnv();        env.AddLoader(MyLoader);  
        env.DoString(
"require 'xluaTest001'");        env.Dispose();    }    ///<summary>//////</summary>///<param name="filepath">文件路径名</param>///<returns>加载器加载的lua文件</returns>publicbyte[] MyLoader(refstring 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;publicclass 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>publicbyte[] MyLoader(refstring 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 framevoid Update() {    } }


2.)访问全局的table表

//先建立一个类,与lua中的表对应class MyPerson{    publicstring name;    publicint age;    publicbool 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]delegateint 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>publicbyte[] MyLoader(refstring filepath)     {         // streamingAssets下的lua文件加载string path = Application.streamingAssetsPath + "/" + filepath + ".lua.txt";        //lua中代码文本转换字节数组return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));    }


四.Lua调用C#

using System.Collections;using System.Collections.Generic;using UnityEngine;using XLua;publicclass LuaCallCSharpTest : MonoBehaviour {    void Start () {               LuaEnv luaEnv = new LuaEnv();        luaEnv.DoString("require 'LuaCallCSharpTest'");        luaEnv.Dispose();     }    void Update () {            }}
    然后在   LuaCallCSharpTest.lua.txt 文本里面进行lua脚本编写
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)

转载于:https://www.cnblogs.com/lk95/p/10114907.html

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-11-24 12:02 , Processed in 0.073854 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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