当前位置: 首页 > news >正文

xlua游戏热更新(C#访问lua)

xlua作为Unity资源热更新的重要解决方案api,在Tecent重多游戏中被采用,本文通过案例去讲解xlua代码结构层次。

/** Tencent is pleased to support the open source community by making xLua available.* Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.* Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at* http://opensource.org/licenses/MIT* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
*/using UnityEngine;
using XLua;namespace XLuaTest
{public class Helloworld : MonoBehaviour{// Use this for initializationvoid Start(){//创建xlua虚拟机LuaEnv luaenv = new LuaEnv();luaenv.DoString("print('hello xlua!')");luaenv.DoString("CS.UnityEngine.Debug.Log('hello world')");//释放资源luaenv.Dispose();}// Update is called once per frame}
}

image.png

加载lua文件

Resources.Load(“xlua/xx.lua”) 加载

创建Resources 目录下xx.lua.txt文件

//创建xlua虚拟机【建议全局唯一】
LuaEnv luaenv = new LuaEnv();
//加载lua脚本资源
TextAsset textAsset = Resources.Load<TextAsset>("xlua/hello.lua");
luaenv.DoString(textAsset.ToString());

loader加载

luaenv.DoString("require 'xlua/hello'"); //require + 'lua文件名称不加扩展名'
//require 实际上是逐个查找loader文件 是否存在指定文件

自定义loader

挨个查找loader,若某个loader返回了字节数组,那么便不继续查找了

  //加载loaderluaenv.AddLoader(Myloader);luaenv.DoString("require 'xlua/hello'");//挨个查找loader,若某个loader返回了字节数组,那么便不继续查找了//释放资源luaenv.Dispose();/// <summary>/// 自定义loader/// </summary>/// <param name="filePath"></param>/// <returns></returns>private byte[] Myloader(ref string filePath){print(filePath);string s = "print(123)";return Encoding.UTF8.GetBytes(s);}

image.png

构建Assets/StreamingAssets文件夹

  private byte[] Myloader(ref string filePath){//print(filePath);string absPath = Application.streamingAssetsPath + "/" + filePath + ".lua.txt";return Encoding.UTF8.GetBytes(File.ReadAllText(absPath));}

C#访问lua文件

全局变量

加载文件成功后,访问lua文件中的全局变量
–number 可以对应int float double

           //通过luaenv 访问变量int integer_Lua = luaenv.Global.Get<int>("Integer");string name_Lua = luaenv.Global.Get<string>("Name");Debug.Log(integer_Lua + name_Lua);

//lua文件中person = {Name = "James",Sno = 23,eat = function()print("i'm eating!")end}
//
//C#
class Person{public string _name;public int _sno;}Person luaPerson = luaenv.Global.Get<Person>("person");print(luaPerson._sno + ":" + luaPerson._name);

接口

IPerson luaPerson = luaenv.Global.Get<IPerson>("person");print(luaPerson.sno + ":" + luaPerson.name);[CSharpCallLua]interface IPerson{string name { get; set; }int sno { get; set; }void eat();}

字典

dic = {china = 1,america = 2,uk  = 3,
}
 //通过字典遍历Dictionary<string,int> dic =  luaenv.Global.Get<Dictionary<string, int>>("dic");foreach (var key in dic.Keys){print(key + ":" + dic[key]);}

image.png

列表

list = {'sdahjk',12,123,'12'}
  //通过list访问List<object> list =  luaenv.Global.Get<List<object>>("list");foreach (var target in list){print(target.ToString());}

再将上述数据通过List读取一次
image.png

LuaTable

LuaTable table = luaenv.Global.Get<LuaTable>("person");table.Get<string>("name");

函数

 [CSharpCallLua]delegate int Add(int a, int b);//函数Add add = luaenv.Global.Get<Add>("add");print(add(3,5));add = null;

lua多返回值通过,out 变量接受

add = function(a,b)return a + b,a,b
end
 delegate int Add2(int a, int b, out int resa, out int resb);

使用LuaFunction (性能差)

LuaFunction add = luaenv.Global.Get<LuaFunction>("add");object[] objects = add.Call(3, 5);print(objects[0]);

相关文章:

xlua游戏热更新(C#访问lua)

xlua作为Unity资源热更新的重要解决方案api&#xff0c;在Tecent重多游戏中被采用&#xff0c;本文通过案例去讲解xlua代码结构层次。 /** Tencent is pleased to support the open source community by making xLua available.* Copyright (C) 2016 THL A29 Limited, a Tence…...

【数据结构】二叉树经典例题---<你真的掌握二叉树了吗?>(第一弹)

一、已知一颗二叉树如下图&#xff0c;试求&#xff1a; (1)该二叉树前序、中序和后序遍历的结果。 (2)该二叉树是否为满二叉树&#xff1f;是否为完全二叉树&#xff1f; (3)将它转换成对应的树或森林。 (4)这颗二叉树的深度为多少? (5)试对该二叉树进行前序线索化。 (6)试对…...

基于springboot实现桥牌计分管理系统项目【项目源码】

基于springboot实现桥牌计分管理系统演示 JAVA简介 JavaScript是一种网络脚本语言&#xff0c;广泛运用于web应用开发&#xff0c;可以用来添加网页的格式动态效果&#xff0c;该语言不用进行预编译就直接运行&#xff0c;可以直接嵌入HTML语言中&#xff0c;写成js语言&#…...

机器学习——朴素贝叶斯

目录 一、贝叶斯方法 背景知识 贝叶斯公式 二、朴素贝叶斯原理 判别模型和生成模型 1&#xff0e;朴素贝叶斯法是典型的生成学习方法 2&#xff0e;朴素贝叶斯法的基本假设是条件独立性 3&#xff0e;朴素贝叶斯法利用贝叶斯定理与学到的联合概率模型进行分类预测 用于文…...

【PTE-day07 文件上传2】

1、常见的绕过方式 (1)畸形后缀名绕过 .php、.pht、.php3、.php4、.php5、.php2、.phtml、.pHp、.html、.Htm......(2)双写过滤字符绕过 (3).htaccess文件绕过 <FilesMatch "jpg"> SetHandler application/x-httpd-php...

设计模式之十一:代理模式

代理可以控制和管理访问。 RMI提供了客户辅助对象和服务辅助对象&#xff0c;为客户辅助对象创建和服务对象相同的方法。RMI的好处在于你不必亲自写任何网络或I/O代码。客户程序调用远程方法就和运行在客户自己本地JVM对对象进行正常方法调用一样。 步骤一&#xff1a;制作远程…...

在spring boot中调用第三方接口时重试问题

文章目录 前言 spring-retry对第三方接口做重试&#xff0c;和处理操作 一、引入依赖 <!--重试请求的注解依赖--><dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency>&l…...

记录一次多数据源配置失效的情况

说明&#xff1a;在一些复杂的业务情景&#xff0c;比如我们需要在一个订单审核通过后&#xff0c;在将数据库状态修改的同时&#xff0c;将订单与订单详细这两条数据写入到另一个数据库中。我们就可以通过在配置文件中&#xff0c;配置多数据源&#xff0c;然后通过在Mapper的…...

EasyExcel导出替换列中的变量

基于easyexcel2.0版本 easyexcel官网&#xff1a;https://easyexcel.opensource.alibaba.com/docs/2.x/quickstart/write 测试代码地址&#xff1a;https://gitee.com/wangtianwen1996/cento-practice/blob/master/src/test/java/com/xiaobai/easyexcel/DynamicHeadTest.java …...

机器人规划算法——将多边形障碍物离散到地图像素点上?

问题一&#xff1a;如何判断一个点是否在多边形区域内&#xff1f; 方法1&#xff1a;向量叉乘判别法 设多边形的顶点依次为A1&#xff0c;A2…An&#xff0c;要判断的点为P&#xff0c;那么分别计算向量PA1叉乘向量PA2&#xff0c;向量PA2叉乘向量PA3&#xff0c;…&#xff…...

windows11使用docker部署安装minio

时间 2023-11-08 windows11使用docker部署安装minio 目录 1.docker 下载镜像2.docker安装镜像3.访问控制台4.安装问题解决5.使用教程 1.docker 下载镜像 调整镜像源到国内&#xff0c;否则会很慢 docker pull minio/minio2.docker安装镜像 设置用户名和密码时需要注意&…...

【JavaEESpring】Spring Web MVC⼊⻔

Spring Web MVC 1. 什么是 Spring Web MVC1.1 什么是 MVC ?1.2 是什么 Spring MVC? 2. 学习 Spring MVC2.1 建立连接2.2 请求2.3 响应 3. 相关代码链接 1. 什么是 Spring Web MVC 官⽅对于 Spring MVC 的描述是这样的&#xff1a; 1.1 什么是 MVC ? MVC 是 Model View C…...

flutter逆向 ACTF native app

前言 算了一下好长时间没打过CTF了,前两天看到ACTF逆向有道flutter逆向题就过来玩玩啦,花了一个下午做完了.说来也巧,我给DASCTF十月赛出的逆向题其中一道也是flutter,不过那题我难度降的相当之低啦,不知道有多少人做出来了呢~ 还原函数名 flutter逆向的一大难点就是不知道l…...

【Redis】set 集合

上一篇&#xff1a;list 列表 https://blog.csdn.net/m0_67930426/article/details/134364315?spm1001.2014.3001.5501 目录 Sadd Smembers Sismember Scard Srem ​编辑Srandomember Spop Smove 集合类 Sdiff Sinter Sunion 官网 https://redis.io/commands/?…...

【算法与设计模式】

一、数据结构与算法 1、算法性能评估 时间复杂度、空间复杂度 2、数据结构 数组与列表 队列 堆栈 链表 二叉树 多叉树 递归算法 二、设计模式 1、单例 &#xff08;1&#xff09;GIL&#xff1a;线程互斥锁。保证同一时刻只有一个线程在进行。 &#xff08;2&#xff09…...

Javaweb之javascript的小案例的详细解析

1.5.4 案例 1.5.4.1 需求说明 鲁迅说的好&#xff0c;光说不练假把式,光练不说傻把式。所以接下来我们需要通过案例来加强对于上述DOM知识的掌握。需求如下3个&#xff1a; 点亮灯泡 将所有的div标签的标签体内容后面加上&#xff1a;very good 使所有的复选框呈现被选中的…...

Vant 移动端UI 组件自动引入

Vue项目中安装Vant # Vue 3 项目&#xff0c;安装最新版 Vant npm i vant 组件按需引入配置 Vant按需引入- - -安装&#xff1a;unplugin-vue-components 插件 unplugin-vue-components 插件可以在Vue文件中自动引入组件&#xff08;包括项目自身的组件和各种组件库中的组件&…...

敏捷开发是什么?敏捷开发流程是怎么样的?

1. 什么是敏捷开发&#xff1f; 敏捷开发是一种迭代、增量式的软件开发方法&#xff0c;旨在通过灵活、协作和快速响应变化的方式&#xff0c;提高开发团队的效率和产品的质量。相较于传统的瀑布式开发模型&#xff0c;敏捷开发更加注重用户需求的响应和团队协作&#xff0…...

【CASS精品教程】cass3d 11.0加载超大影像、三维模型、点云数据

CAD2016+CASS11.0(内置3d)下载与安装: 【CASS精品教程】CAD2016+CASS11.0安装教程(附CASS11.0安装包下载)https://geostorm.blog.csdn.net/article/details/132392530 一、cass11.0 3d支持的数据 cass11.0中的3d模块增加了多种数据的支持,主要有: 1. 三维模型 点击…...

Unity Input System最简单使用

开始学的是 Input Manager 比较好理解&#xff0c;Input System却不好理解&#xff0c;教程也找了很多&#xff0c;感觉都讲的不清楚&#xff0c;我这里做一个最简单的用 Input System 添加鼠标左键和右键的效果。 1. 安装 Input System 包 首先这个功能不是内置的&#xff0…...

3步解放你的华硕笔记本:G-Helper轻量控制工具完全指南

3步解放你的华硕笔记本&#xff1a;G-Helper轻量控制工具完全指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Sc…...

软考高项通关秘籍:手把手教你用Excel打造需求跟踪矩阵(附模板下载)

软考高项实战指南&#xff1a;用Excel构建需求跟踪矩阵的7个关键步骤 在项目管理领域&#xff0c;需求跟踪矩阵就像是一张精准的导航地图&#xff0c;它能确保项目团队从需求源头到最终交付物始终保持正确的航向。对于备考软考高项&#xff08;信息系统项目管理师&#xff09;的…...

Win11系统虚拟化性能优化指南:VBS关闭与配置全解析

1. 为什么需要关闭VBS虚拟化功能&#xff1f; 很多朋友升级到Win11后会发现电脑变卡了&#xff0c;尤其是玩游戏或者运行大型软件时帧数明显下降。这很可能是因为系统默认开启了VBS&#xff08;Virtualization-Based Security&#xff09;虚拟化安全功能。我去年刚换新电脑时就…...

哪些场景对IP精准度要求最高?金融、广告、CDN等五大领域解析

在IP查询工具的选型中&#xff0c;精准度往往是决定技术方案成败的关键。不同业务场景对定位误差的容忍度差异极大&#xff1a;内容推荐可以接受城市级偏差&#xff0c;但金融风控中一个IP的误判就可能造成数万元损失。本文梳理了五大对IP精准度要求最高的场景&#xff0c;并分…...

深度解析:macOS微信防撤回插件WeChatIntercept的5个核心技术揭秘

深度解析&#xff1a;macOS微信防撤回插件WeChatIntercept的5个核心技术揭秘 【免费下载链接】WeChatIntercept 微信防撤回插件&#xff0c;一键安装&#xff0c;仅MAC可用&#xff0c;支持v3.7.0微信 项目地址: https://gitcode.com/gh_mirrors/we/WeChatIntercept 作为…...

手把手教你用Python+sklearn生成classification_report,并一键导出可视化报告

Pythonsklearn自动化模型评估报告&#xff1a;从classification_report到可视化仪表盘 在数据科学项目的交付环节&#xff0c;如何将模型评估结果清晰呈现给非技术背景的决策者&#xff0c;往往比模型开发本身更具挑战性。传统打印classification_report的方式存在三个痛点&…...

算法7-中级提升班2(实战篇)

问题1:机器物品平均问题 这道题使用贪心算法。 计算出数组位置的平均值。对于每一个位置,可以分别计算出左部分和右部分缺少或多出的数量,不同情况需要移动的最大次数如上图所示。 例如对于数组[100,0,0,0],对于位置0的100,右部分的值为-75,需要往右侧移动75件物品;对于…...

5分钟搞定AI摄影:Realistic Vision V5.1快速部署与参数调优全攻略

5分钟搞定AI摄影&#xff1a;Realistic Vision V5.1快速部署与参数调优全攻略 1. 认识Realistic Vision V5.1&#xff1a;你的虚拟摄影师 Realistic Vision V5.1是目前Stable Diffusion生态中最强大的写实风格图像生成模型之一。它就像一个24小时待命的专业摄影师&#xff0c…...

【SAP CO】3.产品成本-5.成本核算变式配置

目录 一、成本核算变式组件 二、BOM核算优先级设定 三、Routine核算优先级设定 一、成本核算变式组件 控制-->产品成本控制-->产品成本计划编制-->带数量结构的成本估算-->定义成本核算变式 控制-->产品成本控制-->产品成本计划编制-->带数量结构的成…...

【工业PHP物联网网关开发实战指南】:从零搭建高并发、低延迟数据中继系统(含Modbus/TCP+MQTT双协议栈源码)

第一章&#xff1a;工业PHP物联网数据网关开发概览工业物联网&#xff08;IIoT&#xff09;场景中&#xff0c;PHP 作为成熟稳定的后端语言&#xff0c;正以轻量、可扩展、易集成的特性&#xff0c;在边缘侧数据网关开发中焕发新生。本章聚焦于构建一个面向工业现场的 PHP 数据…...