C#和Lua的交互

1.C#调用Lua

        1.1C#调用Lua文件中的全局变量

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XLua;

/*
*创建者:
*创建时间:
*描述:XLua管理器
*版本:
*/
public class XLuaManager 
{
    public static LuaEnv le;//Lua环境变量(官方建议全局)
    private XLuaManager(){ }
    private static XLuaManager instance;
    public static XLuaManager Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new XLuaManager();
                Init();//调用XLua管理器时进行初始化
            }
            return instance;
        }
    }
    static void Init()//Lua环境初始化+文件加载器
    {
        le=new LuaEnv();
        le.AddLoader(FileLoad);//添加文件加载器
    }
    static byte[] FileLoad(ref string fileName)
    {
        string str = Application.dataPath + "/Lua/" + fileName + ".lua";
        return File.ReadAllBytes(str);
    }
    public void Do(string fileName)//请求文件
    {
        le.DoString(fileName);
    }
    public void Dispose()//释放资源
    {
        le.Dispose();
    }
}

 //Lua文件         //C#调用Lua脚本

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XLua;

/*
*创建者:
*创建时间:
*描述:C#调用Lua文件中的全局变量
*版本:
*/
public class NewBehaviourScript : MonoBehaviour
{
    
    // Start is called before the first frame update
    void Start()
    {
        XLuaManager.Instance.DoString("require('Test')");//调用时初始化并打开文件
        int a = XLuaManager.le.Global.Get<int>("a");//通过泛型指定接收的变量类型
        print(a);
    }

}

         1.2C#访问Lua文件中的函数

         //Lua文件        

          //C#调用Lua脚本

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XLua;

/*
*创建者:
*创建时间:
*描述:C#调用Lua文件中的方法
*版本:
*/
public class NewBehaviourScript : MonoBehaviour
{
    public delegate void Func();//声明与Lua文件中具有相同返回值类型和参数列表的委托
    // Start is called before the first frame update
    void Start()
    {
        XLuaManager.Instance.DoString("require('Test')");
        Func Eat = XLuaManager.le.Global.Get<Func>("Eat");将Lua文件中的方法注册进委托再调用
        Eat();
        
        //适用于多返回值的方法
        LuaFunction lf = le.Global.Get<LuaFunction>("Sum");
        object[] objs = lf.Call(1,2);
        foreach (var item in objs)
        {
            print(item);
        }
    }

}

         1.3C#访问Lua文件中的表

                映射到接口

                 //Lua文件   

        

                   //C#调用Lua脚本

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XLua;

/*
*创建者:
*创建时间:
*描述:C#访问Lua文件中的表
*版本:
*/

[CSharpCallLua]
public class NewBehaviourScript : MonoBehaviour
{
    
    // Start is called before the first frame update
    void Start()
    {
        XLuaManager.Instance.DoString("require('Test')");
        Example example = XLuaManager.le.Global.Get<Example>("Test1");
        print(example.name);
    }
}
[CSharpCallLua]
public interface Example//映射到接口(创建与Lua文件相同键名的属性和方法)
{
    [CSharpCallLua]
    public delegate void Func();
    [CSharpCallLua]
    public int id { get; set; }
    [CSharpCallLua]
    public string name { get; set; }
    [CSharpCallLua]
    public Func Example1 { get; set; }
}

                 1.4遍历Lua文件中表的所有数据

                                1.4.1 创建顶级对象集合接收Lua文件中表的所有数据

        

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XLua;

/*
*创建者:
*创建时间:
*描述:C#访问Lua文件中的表
*版本:
*/

[CSharpCallLua]
public class NewBehaviourScript : MonoBehaviour
{
    
    // Start is called before the first frame update
    void Start()
    {
        XLuaManager.Instance.DoString("require('Test')");
        Example example = XLuaManager.le.Global.Get<Example>("Test1");
         //遍历Lua文件中类(表)的所有数据
        List<object> list = le.Global.Get<List<object>>("Test1");
        foreach (var item in list)
        {
            print(item);
        }
    }
}
[CSharpCallLua]
public interface Example//映射到接口(创建与Lua文件相同键名的属性和方法)
{
    [CSharpCallLua]
    public delegate void Func();
    [CSharpCallLua]
    public int id { get; set; }
    [CSharpCallLua]
    public string name { get; set; }
    [CSharpCallLua]
    public Func Example1 { get; set; }
}

                 1.4.2 创建字典接收Lua文件中表的所有数据

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XLua;

/*
*创建者:
*创建时间:
*描述:C#访问Lua文件中的表
*版本:
*/

[CSharpCallLua]
public class NewBehaviourScript : MonoBehaviour
{
    
    // Start is called before the first frame update
    void Start()
    {
        XLuaManager.Instance.DoString("require('Test')");
        Example example = XLuaManager.le.Global.Get<Example>("Test1");
         //遍历Lua文件中类(表)的所有数据
        Dictionary<object, object> dic = le.Global.Get<Dictionary<object, object>>("Test1");
        foreach (var item in dic)
        {
            print(item.Key+"\t"+item.Value);
        }
    }
}
[CSharpCallLua]
public interface Example//映射到接口(创建与Lua文件相同键名的属性和方法)
{
    [CSharpCallLua]
    public delegate void Func();
    [CSharpCallLua]
    public int id { get; set; }
    [CSharpCallLua]
    public string name { get; set; }
    [CSharpCallLua]
    public Func Example1 { get; set; }
}

        1.5 C#遍历Lua文件中所有数据

              //Lua文件  

 

        //C#脚本调用Lua

        

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
using XLua;

/*
*创建者:
*创建时间:
*描述:
*版本:
*/
public class HomeWork_3_31 : MonoBehaviour
{
    LuaEnv le;
    // Start is called before the first frame update
    void Start()
    {
        le = new LuaEnv();
        le.AddLoader(FileLoad);
        le.DoString("require('HomeWork_3_31TableLua')");
        HomeWork hw = le.Global.Get<HomeWork>("HomeWork");//Lua文件使用io.open调用其他lua
//文件,需要通过映射该lua文件间接调用其他lua文件
        hw.Init();
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    byte[] FileLoad(ref string fileName)
    {
        string str = Application.dataPath + "/Lua/" + fileName + ".lua";
        return File.ReadAllBytes(str);
    }
    private void OnDestroy()
    {
        //le.Dispose();
    }
}
[CSharpCallLua]
public interface HomeWork //映射到接口
{
    [CSharpCallLua]
    public delegate void func1();
    [CSharpCallLua]
    public delegate void func2(string s);

    [CSharpCallLua]
    public func1 Init();
    [CSharpCallLua]
    public func1 Register();
    [CSharpCallLua]
    public func1 Login();
    [CSharpCallLua]
    public func2 Split(string s);

}

2.Lua调用C#

        2.1 工程配置:Edit=>ProjectSettings=>Player=>OtherSettings=>ScriptCompliation

        2.2Lua调用C#

 //Lua文件(对该方法进行覆写)

 //C#调用Lua文件,执行热更新

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XLua;

/*
*创建者:
*创建时间:
*描述:Lua调用C#
*版本:
*/

[Hotfix]
public class NewBehaviourScript : MonoBehaviour
{   
    // Start is called before the first frame update
    void Start()
    {
        XLuaManager.Instance.DoString("require('Test')");  //执行Lua文件
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/6852.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计讯物联智慧景区应用解决方案,开启交互式智慧旅游新篇章

方案背景 后疫情时代&#xff0c;旅游市场逐步回暖。随着游客的旅游需求趋向个性化、多元化&#xff0c;景区的数字化转型升级势在必行。在此背景下&#xff0c;计讯物联充分发挥5G、云计算、物联网、大数据等技术的应用价值&#xff0c;以技术创新推动业务创新&#xff0c;面…

2022蓝桥杯省赛——砍竹子

问题描述 这天, 小明在砍竹子&#xff0c; 他面前有 n 棵竹子排成一排&#xff0c;一开始第 i 棵竹子的 高度为 hi​。 他觉得一棵一棵砍太慢了&#xff0c; 决定使用魔法来砍竹子。魔法可以对连续的一 段相同高度的竹子使用&#xff0c; 假设这一段竹子的高度为 H&#xff0…

【SSM】Spring6(二.Bean的生命周期)

文章目录1.Bean的作用域1.1 singleton1.2 prototype1.3 scope其它属性1.Bean的作用域 SpringBean.java package com.sdnu.spring6.bean;public class SpringBean {public SpringBean() {System.out.println("执行springBean的构造方法");} }spring-scope.xml <…

前后端分离下的-SpringSecurity

前后端分离下的SpringSecurity 项目创建 使用SpringBoot初始化器创建SpringBoot项目 修改项目依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2…

商务谈判Business Negotiation

目录 前言原文文章商务谈判常用会话前言 继续💪 原文文章 商务谈判常用会话 ❶ I cannot understand your point well. 我不太理解你的观点。 ❷ I’m conferring with my customers about online orders. 我现在跟我的顾客协商网上订单的事。 ❸ We express our pleasur…

Generalist: Decoupling Natural and Robust Generalization

通过原始图片在训练过程出的模型会受到敌对样本的干扰&#xff0c;这种问题虽然通过对抗训练增加了抵抗敌对样本的鲁棒性&#xff0c;但也损失了一部分自然泛化的能力。为了解决这个问题&#xff0c;我们将自然泛化和鲁棒泛化与联合训练解耦&#xff0c;并为每个训练制定不同的…

如何有效地跟踪项目进展?

项目失败的代价很高。通过进度跟踪&#xff0c;你可以预见问题&#xff0c;并采取必要的措施引导项目回到正轨。 根据最近的一项研究&#xff0c;由于项目表现不佳&#xff0c;组织平均浪费了其总投资的11.4%。此外&#xff0c;在那些低估了健全项目管理的重要性的企业中&…

高频面试:如何解决MySQL主从复制延时问题

MySQL 主从一直是面试常客&#xff0c;里面的知识点虽然基础&#xff0c;但是能回答全的同学不多。 比如我之前面试小米&#xff0c;就被问到过主从复制的原理&#xff0c;以及主从延迟的解决方案&#xff0c;你之前面试&#xff0c;有遇到过哪些 MySQL 主从的问题呢&#xff…

Goby漏洞更新 | SolarView Compact downloader.php 任意命令执行漏洞(CVE-2023-23333)

漏洞名称&#xff1a;SolarView Compact downloader.php 任意命令执行漏洞&#xff08;CVE-2023-23333 English Name&#xff1a;SolarView Compact downloader.php RCE (CVE-2023-23333) CVSS core: 10.0 影响资产数&#xff1a;5585 漏洞描述&#xff1a; Contec SolarV…

Java题目训练——统计每个月兔子的总数和字符串通配符

目录 一、统计每个月兔子的总数 二、字符串通配符 一、统计每个月兔子的总数 题目描述&#xff1a; 有一种兔子&#xff0c;从出生后第3个月起每个月都生一只兔子&#xff0c;小兔子长到第三个月后每个月又生一只兔子。 例子&#xff1a;假设一只兔子第3个月出生&#xff0c…

天气Weather

前言 加油 原文 天气常用会话 ❶ It looks as though it might clear up. 看起来天好像要转晴。 ❷ The forecast is not accurate. 预报不准确。 ❸ The weatherman says we’ll have a cold spell before the end of this week. 天气预报员说,在这个周末之前会有一股寒…

【数据结构与算法分析】0基础带你学数据结构与算法分析12--红黑树

红黑树 (red-black tree) 是一种自平衡二叉树&#xff0c;于 1972 年由 Rudolf Bayer 发明&#xff0c;发明时被称为 对称二叉 B 树&#xff0c;现代名称红黑树来自 Knuth 的博士生 Robert Sedgewick 于 1978 年发表的论文。红黑树的结构复杂&#xff0c;但操作有着良好的最坏情…

新的勒索软件是迄今为止最快的加密器

在一家美国公司遭到网络攻击后&#xff0c;恶意软件研究人员发现了一种似乎具有“技术独特功能”的新型勒索软件&#xff0c;他们将其命名为 Rorschach。 观察到的功能之一是加密速度&#xff0c;根据研究人员的测试&#xff0c;这将使 Rorschach 成为当今最快的勒索软件威胁。…

对Mysql的了解-索引

什么是索引? 索引是一种用于快速查询和检索数据的数据结构。常见的索引结构有: B 树&#xff0c; B树和 Hash。 索引的作用就相当于目录的作用。打个比方: 我们在查字典的时候&#xff0c;如果没有目录&#xff0c;那我们就只能一页一页的去找我们需要查的那个字&#xff0c…

结合基于规则和机器学习的方法构建强大的混合系统

经过这些年的发展&#xff0c;我们都确信ML即使不能表现得更好&#xff0c;至少也可以在几乎所有地方与前ML时代的解决方案相匹配。比如说一些规则约束&#xff0c;我们都会想到能否把它们替换为基于树的ml模型。但是世界并不总是黑白分明的&#xff0c;虽然机器学习在解决问题…

nacos本地启动单节点

1.官网下载 Releases alibaba/nacos GitHub 解压文件 unzip nacos-server-2.2.1.zip cd /Users/xiaosa/dev_tools/nacos/bin sh startup.sh -m standalone 启动不成功&#xff0c;报错入如下 原因是下面的配置为空。位置在nacos/config目录下的application.properties文件…

【英语】大学英语CET考试,导学规划与听力题答题技巧笔记(1-2)

文章目录1、课程规划和导学1.1 试卷结构和备考目标1.2 单词&#xff0c;听力&#xff0c;阅读&#xff0c;真题学习方法2、听力技巧课1&#xff08;导学与发音&#xff09;3、听力技巧课2&#xff08;答题技巧&#xff01;重要&#xff01;&#xff09;1、课程规划和导学 主讲…

C语言中宏和函数的9个区别,你都了解吗?

C语言中的宏和函数是非常相似的&#xff0c;它们都可以完成类似的功能。比如&#xff0c;想要求2个数的较大值&#xff0c;使用宏的写法是&#xff1a; // 宏的定义 #define MAX(x, y) ((x)>(y)?(x):(y))// 使用 int m MAX(10, 20);使用函数的写法是&#xff1a; // 函数…

[Golang从零到壹] 1.环境搭建和第三方包管理

文章目录安装go环境go.mod第一种情况&#xff0c;选择GOPATH第二种情况&#xff0c;不选择GOPATH(推荐)GO111MODULEgo module可执行文件位置安装go环境 go在安装时选择好安装目录完成安装之后&#xff0c;还需要设置两个环境变量&#xff1a;GOROOT、GOPATH GOROOT即go的安装…

UnQLite入门

本文介绍UnQLite的基本使用&#xff0c;包括增删改查&#xff0c;事务ACID 文章目录UnQLite介绍UnQLite常用接口函数返回码DemoKey/Value存储数据库游标UnQLite介绍 UnQLite简介 UnQLite是&#xff0c;由 Symisc Systems公司出品的一个嵌入式C语言软件库&#xff0c;它实现了一…