C#调用Lua方法1+C#调用Lua方法2,3

xLua中Lua调用C#代码

        原因:C#实现的系统,因为Lua可以调用,所以完全可以换成Lua实现,因为Lua可以即时更改,即时运行,所以游戏的代码逻辑就可以随时更改。

        实现和C#相同效果的系统,如何实现?

                Lua调用Unity的各种API,从而实现C#开发系统同样的效果

xLua中C#调用Lua代码

        原因:Unity是基于C#语言开发的,所有生命周期函数都是基于C#实现,xLua本身是不存在Unity的相关生命周期函数的。如果希望xLua能够拥有生命周期函数,那么我们可以实现C#作为Unity原始调用,再使用C#调用Lua对应的方法。

具体代码示例:

在前几节提到的使用单例模式的xLuaEnv代码中添加如下代码:

 //返回Lua环境的全局变量public LuaTable Global{get{return _Env.Global;}}

添加CSharpCallVariable脚本代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;public class CSharpCallVariable : MonoBehaviour
{void Start(){xLuaEnv.Instance.DoString("return require('L2C/CSharpCallVariable')");//Debug.Log(data[0]);//LuaEnv提供了一个成员变量Global,它可以用于C#获取Lua的全局变量//Global的数据类型是C#实现的LuaTable,LuaTable是xLua实现的C#和Lua中表对应的数据结构//xLua会将Lua中的全局变量以Table的方式全部存储在Global中//通过运行环境,导出全局变量,类型是LuaTable//LuaTable是C#的数据对象,用于和Lua中的全局变量存储的table对应LuaTable g = xLuaEnv.Instance.Global;//从Lua中,将全局变量提取出来//参数:Lua中全局变量的名称//类型:Lua中全局变量的名称所对应的类型//返回值:变量的值int num = g.Get<int>("num");float rate = g.Get<float>("rate");bool isWoman = g.Get<bool>("isWoman");string name=g.Get<string>("name");Debug.Log("数字:" + num);Debug.Log("浮点数:" + rate);Debug.Log("布尔:" + isWoman);Debug.Log("字符串:" + name);}// Update is called once per framevoid OnDestroy(){xLuaEnv.Instance.Free();}
}

Lua相关代码如下:

--隐性做了{num=100,rate=99.99,isWoman=false,name="admin"}
num=100
rate=99.99
isWoman=false
name="admin"

 运行测试结果如下:

使用C#代码调用Lua代码的函数

相关详细代码如下所示:

//C#相关代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;public delegate void Func1();
public delegate void Func2(string name);
public delegate string Func3();
//映射产生时,xLua提示添加的[CSharpCallLua]
public delegate void Func4(out string name, out int id);
public class CSharpCallFunction : MonoBehaviour
{void Start(){xLuaEnv.Instance.DoString("return require('L2C/CSharpCallFunction')");LuaTable g = xLuaEnv.Instance.Global;//Lua的函数,会导出为C#的委托类型Func1 func1=g.Get<Func1>("func1");func1();//向Lua函数传递数据Func2 func2 = g.Get<Func2>("func2");func2("admin");//接收Lua函数的返回值Func3 func3=g.Get<Func3>("func3");Debug.Log(func3()+",被C#打印");//Lua多返回值Func4 func4 = g.Get<Func4>("func4");string name;int id;func4(out name,out id);Debug.Log(name + "," + id);}// Update is called once per framevoid OnDestroy(){xLuaEnv.Instance.Free();}
}
--Lua相关代码
func1=function()print("这是Lua中的func1")
end
func2=function(name)print("这是Lua中的func2,参数是:"..name)
end
--Lua的函数会导出为C#的委托
func3=function()return "这是Lua中的func3"
end
func4=function()return "这是Lua中的func4",100
end

运行效果如图所示:

使用C#代码调用Lua代码的结构体

详细代码如下所示:

//C#代码如下所示
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;public delegate void OneStringParams(string name);
public delegate void TransSelf(LuaTable table);//针对结构体调用后添加
public delegate string OneStringReturn();
[CSharpCallLua]
public delegate void TransMy(LuaCore table);//Lua映射table过来,需要有个结构体进行对应
//Lua的table导出到C#的结构体,可以实现C#运行时无GC
[GCOptimize]
public struct LuaCore
{public int ID;public string Name;public bool IsWoman;public OneStringParams Func1;public OneStringReturn Func2;public TransMy Func3;public TransMy Func4;
}
public class CSharpCallTable : MonoBehaviour
{void Start(){xLuaEnv.Instance.DoString("require('L2C/CSharpCallTable')");//UseLuaTable();UseStruct();}public void UseLuaTable(){LuaTable g = xLuaEnv.Instance.Global;//获取的是全局变量Core,因为它在Lua中是表,所以取出的是LuaTableLuaTable core = g.Get<LuaTable>("Core");//获取Name//参数:table中索引名//类型:索引对应值的类型Debug.Log(core.Get<string>("Name"));core.Set<string, string>("Name", "admin");OneStringParams osp = core.Get<OneStringParams>("Func1");osp("admin");//相当于":"调用TransSelf ts = core.Get<TransSelf>("Func4");ts(core);}public void UseStruct(){LuaTable g = xLuaEnv.Instance.Global;//将Lua的table导出为coreLuaCore core=g.Get<LuaCore>("Core");Debug.Log(core.Name);core.Func4(core);}// Update is called once per framevoid OnDestroy(){xLuaEnv.Instance.Free();}
}
--Lua代码如下所示
Core={}Core.ID=100
Core.Name="root"
Core.IsWoman=falseCore.Func1=function(name)print("这是Core表的Func1函数,接收到C#数据"..name)
endCore.Func2=function()return "这是Core表的Func2函数"
end
Core.Func3=function(self)print("这是Core表的Func3函数,Core表的成员变量Name是"..self.Name)
endfunction Core:Func4()print("这是Core表的Func4函数,Core表的成员变量Name是"..self.Name)
end

当出现以下问题提示添加[CSharpCallLua]解决问题,在代码中添加后却依然报错,可尝试以下方式解决问题:

按下上图按键后重新运行游戏,报错即可消失

更多有关于Lua与CS之间相互调用的相关知识:

https://shenjun-coder.github.io/LuaBook

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

macOS Chrome - 打开开发者工具,设置 Local storage

文章目录 macOS Chrome - 打开开发者工具设置 Local storage macOS Chrome - 打开开发者工具 方式2&#xff1a;右键点击网页&#xff0c;选择 检查 设置 Local storage 选择要设置的 url&#xff0c;显示右侧面板 双击面板&#xff0c;输入要添加的内容 2025-04-08&#xff…

zustand 源码解析

文章目录 实现原理createcreateStore 创建实例CreateStoreImpl 实现发布订阅createImpl 包装返回给用户调用的 hookuseSyncExternalStoreWithSelector 订阅更新zustand 性能优化自定义数据更新createWithEqualityFncreateWithEqualityFnImpl 返回 hookuseSyncExternalStoreWith…

kotlin,Android,jetpack compose,日期时间设置

AI生成&#xff0c;调试出来学习&#xff0c;这些小组件会用了&#xff0c;就可以组合一个大点的程序了。 package com.example.mydatetimeimport android.app.AlertDialog import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.co…

构建k8s下Helm私有仓库与自定义Chart开发指南

#作者&#xff1a;程宏斌 文章目录 自定义helm模板1、开发自己的chare包2、调试chart3、安装chart 自定义helm模板 https://hub.helm.sh/ 1、开发自己的chare包 [rootmaster ~]# helm create mychare //创建一个名为mychare的chare包 [rootmaster ~]# tree -C mychare/ //以…

MOP数据库中的EXPLAIN用法

EXPLAIN 是 SQL 中的一个非常有用的工具&#xff0c;主要用于分析查询语句的执行计划。执行计划能展示数据库在执行查询时的具体操作步骤&#xff0c;像表的读取顺序、使用的索引情况、数据的访问方式等&#xff0c;这有助于我们对查询性能进行优化。 语法 不同的数据库系统&…

项目范围蔓延的十大诱因及应对策略

项目范围蔓延的十大诱因及应对策略是什么&#xff1f;主要在于&#xff1a; 缺乏清晰目标、利益相关方过多、需求变更未及时管控、缺少优先级体系、沟通链条冗长、管理层干预频繁、资源与预算不匹配、技术风险被低估、合同或协议不完善、缺乏阶段性验收与复盘。其中缺乏清晰目标…

做好一个测试开发工程师第二阶段:java入门:idea新建一个project后默认生成的.idea/src/out文件文件夹代表什么意思?

时间&#xff1a;2025.4.8 一、前言 关于Java与idea工具安装不再展开&#xff0c;网上很多教程&#xff0c;可以自己去看 二、project建立后默认各文件夹代表意思 1、首先new---->project后会得到文件如图 其中&#xff1a; .idea文件代表&#xff1a;存储这个项目的历史…

算法进阶指南 分形

问题描述 分形&#xff0c;具有以非整数维形式充填空间的形态特征。通常被定义为&#xff1a; “一个粗糙或零碎的几何形状&#xff0c;可以分成数个部分&#xff0c;且每一部分都&#xff08;至少近似地&#xff09;是整体缩小后的形状”&#xff0c;即具有自相似的性质。 现…

18-产品经理-跟踪进度

禅道是一个可以帮助产品经理跟踪研发进度的系统。通过禅道&#xff0c;产品经理可以从多个角度了解产品的研发状态。在仪表盘中&#xff0c;可以展示所有产品或单一产品的概况&#xff0c;包括需求、计划和发布数量&#xff0c;研发需求状态&#xff0c;Bug修复率和计划发布数。…

LeetCode算法题(Go语言实现)_36

题目 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从父节点到子节点…

深度解析:文件或目录损坏且无法读取的应对之道

引言 在数字化办公与数据存储日益普及的今天&#xff0c;我们时常会遭遇各种数据问题&#xff0c;其中“文件或目录损坏且无法读取”这一状况尤为令人头疼。无论是个人用户存储在电脑硬盘、移动硬盘、U盘等设备中的重要文档、照片、视频&#xff0c;还是企业服务器上的关键业务…

数据库如何确定或计算 LSN(日志序列号)

目录 如何确定或计算 LSN&#xff08;日志序列号&#xff09;**一、获取当前 LSN****二、确定日志解析的起始 LSN****三、LSN 与物理文件的映射****四、应用场景** 如何确定或计算 LSN&#xff08;日志序列号&#xff09; LSN&#xff08;Log Sequence Number&#xff09;是数…

[ctfshow web入门] web24

前置知识 isset&#xff1a;判断这个变量是否声明且不为NULL&#xff0c;否则返回False mt_srand&#xff1a;设置随机数种子&#xff0c;如果不手动设置&#xff0c;那么系统会自动进行一次随机种子的设置 mt_rand&#xff1a;生成一个随机数&#xff0c;这个随机数与种子有个…

习题与正则表达式

思路&#xff1a; 二分查找&#xff1a; left 1&#xff08;最小可能距离&#xff09;&#xff0c;right L&#xff08;最大可能距离&#xff09;。 每次取 mid (left right) / 2&#xff0c;判断是否可以通过增设 ≤ K 个路标使得所有相邻路标的距离 ≤ mid。 贪心验证…

最小K个数

文章目录 题意思路代码 题意 题目链接 思路 代码 class Solution { public:vector<int> smallestK(vector<int>& arr, int k) {priority_queue<int> Q;for (auto &index:arr){Q.push(index);if (Q.size() > k)Q.pop();}vector<int> ans…

<tauri><rust><GUI>基于rust和tauri,将tauri程序打包为window系统可安装的安装包(exe、msi)

前言 本文是基于rust和tauri,由于tauri是前、后端结合的GUI框架,既可以直接生成包含前端代码的文件,也可以在已有的前端项目上集成tauri框架,将前端页面化为桌面GUI。 发文平台 CSDN 环境配置 系统:windows 10平台:visual studio code语言:rust、javascript库:taur…

SAP系统采购信息记录失效

问题&#xff1a;采购信息记录失效 现象&#xff1a;最初主数据导入完成之后&#xff0c;单元测试的时采购信息记录是有效的&#xff0c;中间经过配置的变化&#xff0c;集成测试初期发现采购信息记录全部失效。 原因&#xff1a; 单元测试时发现采购订单里面的条件类型…

视频分析设备平台EasyCVR打造汽车门店经营场景安全:AI智慧安防技术全解析

一、方案背景 某电动车企业不停爆出维权新闻&#xff0c;支持和反对的声音此起彼伏&#xff0c;事情不断发酵、反转&#xff0c;每天都有新消息&#xff0c;令人目不暇接。车展、车店作为维权事件的高发场所&#xff0c;事后复盘和责任认定时&#xff0c;安防监控和视频监控平…

ecovadis认证基本概述,ecovadis认证审核有效期

EcoVadis认证基本概述 1. 什么是EcoVadis认证&#xff1f; EcoVadis是全球领先的企业可持续发展&#xff08;ESG&#xff09;评级平台&#xff0c;专注于评估企业在**环境&#xff08;E&#xff09;、劳工与人权&#xff08;S&#xff09;、商业道德&#xff08;L&#xff09…

初入Web网页开发

1、网页哪些内容 1.1 三个核心文件的作用 index.html&#xff1a;网页的骨架&#xff0c;用HTML编写网页结构和内容。 script.js&#xff1a;网页的行为&#xff0c;用JavaScript实现交互功能&#xff08;如按钮点击事件&#xff09;。 styles.css&#xff1a;网页的外观&…