zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    mysql备份及恢复
    mysql备份及恢复
    mysql备份及恢复
  • 原文地址:https://www.cnblogs.com/lk95/p/10114907.html
Copyright © 2011-2022 走看看