xLua环境控制+xLua的Lua调用C#的1

编写自定义加载器加载指定路径的Lua文件:

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XLua;

//Lua是脚本语言,编写代码脚本是实现功能最重要的方式
public class Loader : MonoBehaviour
{
    void Start()
    {
        MyLoader();
    }
    public void MyLoader()
    {
        LuaEnv env = new LuaEnv();
        //将我定义的加载器,加入到xLua的解析环境中
        env.AddLoader(ProjectLoader);
        env.DoString("require('test1')");
        env.Dispose();
    }
    //自定义加载器
    //自定义加载器,会先于系统内置加载器执行,当自定义加载器加载到文件后,后续的加载器则不会继续执行
    //当Lua代码执行require()函数时,自定义加载器会尝试获得文件的内容
    //参数:被加载Lua文件的路径
    //如果需要加载的文件不存在,记得返回null
    public byte[] ProjectLoader(ref string filepath)
    {
        //filepath来自于Lua的require("文件名")
        //构造路径,才能将require加载的文件指向到我们想放Lua的路径下去
        string path = Application.dataPath;
        path=path.Substring(0, path.Length-7)+"/DataPath/Lua/"+filepath+".lua";
        //将Lua文件读取为字节数组
        //xLua的解析环境,会执行我们自定义加载器返回的Lua代码
        return File.ReadAllBytes(path);
    }
}

将创建的自定义Lua加载器创建为单例:

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XLua; 

public class xLuaEnv
{
    #region Singleton
    private static xLuaEnv _Instance = null;
    public static xLuaEnv Instance
    {
        get
        {
            if (_Instance == null)
            {
                _Instance = new xLuaEnv();
            }
            return _Instance;
        }
    }
    #endregion
    #region Create LuaEnv
    private LuaEnv _Env;
    //创建单例的时候,Lua运行环境,会一起被创建
    private xLuaEnv()
    {
        _Env = new LuaEnv();
        _Env.AddLoader(_ProjectLoader);
    }
    #endregion
    #region Loader
    //创建自定义Lua加载器,这样就可以任意订制项目的Lua脚本的存储位置
    public byte[] _ProjectLoader(ref string filepath)
    {
        string path = Application.dataPath;
        path = path.Substring(0, path.Length - 7) + "/DataPath/Lua/" + filepath + ".lua";
        if (File.Exists(path))
        {
            return File.ReadAllBytes(path);
        }
        else
        {
            return null;
        }
    }
    #endregion
    #region Free LuaEnv
    public void Free()
    {
        //释放LuaEnv,同时也释放单例对象,这样下次调单例对象,会再次产生Lua运行环境
        _Env.Dispose();
        _Instance = null;
    }
    #endregion
    #region Run Lua
    public object[] DoString(string code)
    {
        return _Env.DoString(code);
    }
    #endregion
}

编写脚本测试单例:

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestSingleton : MonoBehaviour
{
    void Start()
    {
        xLuaEnv.Instance.DoString("require('test1')");
    }
    private void OnDestroy()
    {
        xLuaEnv.Instance.Free();
    }
}

运行查看输出:

接触一个新的Lua项目时,先要弄懂Lua的加载器规则,只有这样,才能弄懂项目的Lua执行流程。

研究C#的静态类如何被Lua调用:

编写C#脚本代码如下:

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


namespace HX
{
    public static class TestStatic
    {
        public static int ID = 99;
        public static string Name
        {
            get;
            set;
        }
        public static string Output()
        {
            return "static";
        }
        public static void Default(string str="abc")
        {
            Debug.Log(str);
        }
    }

}
public class LuaCallStatic : MonoBehaviour
{
    void Start()
    {
        xLuaEnv.Instance.DoString("require('C2L/LuaCallStatic')");
    }
    private void OnDestroy()
    {
        xLuaEnv.Instance.Free();
    }
}

根据C#代码中提到的路径创建对应的Lua文件,在文件中编写Lua脚本如下所示:

Lua 复制代码
--Lua调用静态类
--规则"CS.命名空间.类名.成员变量"
print(CS.HX.TestStatic.ID)

--给静态属性赋值
CS.HX.TestStatic.Name = "admin"
print(CS.HX.TestStatic.Name)

--静态成员方法调用
--规则"CS.命名空间.类名.方法名()"
print(CS.HX.TestStatic.Output())

--使用默认值
CS.HX.TestStatic.Default()
--使用Lua传递的值
CS.HX.TestStatic.Default("DEF")

其测试结果如下所示:

该系列专栏为网课课程笔记,仅用于学习参考。

相关推荐
Scott9999HH1 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
EIP低代码平台1 小时前
EIP 低代码平台 - 角色维护
低代码·c#·权限·工作流·netcore
码智社2 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海2 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖3 小时前
JDK 26 新特性详解
java·开发语言
马优晨4 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区5 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大6 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai6 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜6 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript