• 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#

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using XLua;
    
    public class 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)

  • 相关阅读:
    unity IOC 的使用
    Senparc之OAuth原理
    改进的日志记录类
    发一个 Nuget打包发布小工具
    贴一个微信小程序跳一跳辅助
    调用API让声卡发出声音
    控制台彩色输出
    C#调用cmd实现自我删除
    一个适合新手的简易计算器
    简单Console进度条
  • 原文地址:https://www.cnblogs.com/lk95/p/10114907.html
Copyright © 2020-2023  润新知