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 initialization
        void 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返回了字节数组,那么便不继续查找了

  //加载loader
            luaenv.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]);

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

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

相关文章

android自定义switch颜色

效果图&#xff1a; 原生样式和自己app的主题颜色不搭配&#xff0c;就可以这样自定义颜色样式。以下代码均可直接复制粘贴使用&#xff0c;且均有注释。 实现&#xff1a; 1、 新建drawable/switch_custom_thumb_on.xml&#xff08;滑块开启状态 &#xff09; <?xml ve…

WGCLOUD实践 - wgToken怎么使用

wgcloud中的wgToken&#xff0c;是server和agent通信的密钥&#xff0c;相当于密码 server配置文件中的wgToken值和agent配置文件中的wgToken值&#xff0c;需要相同&#xff0c;否则agent将无法给server上报数据 server配置文件如下&#xff1a; #server和agent的通信密钥&a…

Android修行手册-POI操作Excel实现超链接并且变为蓝色

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

阿里云双11优惠云服务器99元一年,4年396元

阿里云99元服务器新老用户均可以买&#xff0c;你没看错&#xff0c;老用户可以买&#xff0c;活动页面 aliyunfuwuqi.com/go/aliyun 配置为云服务器ECS经济型e实例、2核2G、3M固定带宽、40G ESSD Entry云盘&#xff0c;并且续费不涨价&#xff0c;原价99元即可续费&#xff0c…

论文阅读[121]使用CAE+XGBoost从荧光光谱中检测和识别饮用水中的有机污染物

【论文基本信息】 标题&#xff1a;Detection and Identification of Organic Pollutants in Drinking Water from Fluorescence Spectra Based on Deep Learning Using Convolutional Autoencoder 标题译名&#xff1a;基于使用卷积自动编码器的深度学习&#xff0c;从荧光光谱…

【考研数据结构代码题3】用栈实现十进制数转为八进制数

题目&#xff1a;将十进制数m1348转换成八进制数 难度&#xff1a;★ 算法思路&#xff1a;十进制转八进制的核心原理是“用辗转相除法不断对8取余&#xff0c;最后将余数反向输出”&#xff0c;即先求出来的余数后输出&#xff0c;符合“先进后出”的栈的特性&#xff0c;故设…

WorkPlus安全专属移动数字化航空母舰,助力企业掌控业务和生态

在当今数字化发展的时代&#xff0c;企业迫切需要一种安全专属的移动数字化平台&#xff0c;以助力企业掌控业务和生态&#xff0c;实现全面发展。作为一款安全专属的移动数字化“航空母舰”&#xff0c;WorkPlus凭借其强大的功能和灵活性&#xff0c;成为了企业的首选&#xf…

node 第十七天 使用rsa非对称加密 实现前后端加密通信 JSEncrypt和node-rsa

什么是非对称加密 加密过程需要两个钥匙, 公钥和私钥 其中公钥用于加密明文, 私钥用于解密公钥加密的密文, 解密只可以用私钥 公钥和私钥是一对一的关系 公钥可以发送给用户, 不用担心泄露 私钥需要保存在服务端, 不能泄露 例如: 战场上&#xff0c;B要给A传递一条消息&#xf…

Python语法基础(变量 注释 数据类型 输入与输出 运算符 缩进)

目录 变量变量命名规则变量的类型变量的创建变量的作用域 注释的方法数据类型对象和引用的概念Number(数字)数据转换 输入与输出输入函数输出函数输出函数的end参数输出格式多行语句 运算符算术运算符赋值运算符三目运算符运算符的优先级 缩进缩进格式注意事项层级嵌套 变量 标…

css实战——清除列表中最后一个元素的下边距

需求描述 常见于列表的排版&#xff0c;如文章列表、用户列表、商品列表等。 代码实现 <div class"listBox"><div class"itemBox">文章1</div><div class"itemBox">文章2</div><div class"itemBox"…

软件测试银行项目到底“香”到哪里?

为什么做金融类软件测试&#xff1f; 做金融类软件测试的原因有以下几个&#xff1a; 保障客户资产安全&#xff1a;金融类软件通常涉及大量的客户财产和敏感信息&#xff0c;因此软件测试可以帮助发现潜在的漏洞和风险&#xff0c;从而确保客户的资产和信息得到充分的保护。…

openGauss学习笔记-119 openGauss 数据库管理-设置数据库审计-设置文件权限安全策略

文章目录 openGauss学习笔记-119 openGauss 数据库管理-设置数据库审计-设置文件权限安全策略119.1 背景信息119.2 数据库程序目录及文件权限119.3 建议 openGauss学习笔记-119 openGauss 数据库管理-设置数据库审计-设置文件权限安全策略 119.1 背景信息 数据库在安装过程中…

dRep-基因组质控、去冗余及物种界定

文章目录 Install依赖关系 常用命令常见问题pplacer线程超过30报错当比较基因组很多&#xff08;>4096&#xff09;有了Bdv.csv文件后无需输入基因组list 超多基因组为什么需要界定种&#xff1f;dRep重要概念次级ANI的选择Minimum alignment coverage3. 选择有代表性的基因…

使用递归图 recurrence plot 表征时间序列

在本文中&#xff0c;我将展示如何使用递归图 Recurrence Plots 来描述不同类型的时间序列。我们将查看具有500个数据点的各种模拟时间序列。我们可以通过可视化时间序列的递归图并将其与其他已知的不同时间序列的递归图进行比较&#xff0c;从而直观地表征时间序列。 递归图 …

pytorch基础语法问题

这里写目录标题 pytorch基础语法问题shapetorch.ones_like函数和torch.zeros_like函数y.backward(torch.ones_like(x), retain_graphTrue)torch.autograd.backward参数grad_tensors: z.backward(torch.ones_like(x))来个复杂例子z.backward(torch.Tensor([[1., 0]])更复杂例子实…

供暖系统如何实现数据远程采集?贝锐蒲公英高效实现智慧运维

山西某企业专注于暖通领域&#xff0c;坚持为城市集中供热行业和楼宇中央空调行业提供全面、专业的“智慧冷暖”解决方案。基于我国供热行业的管理现状&#xff0c;企业成功研发并推出了可将能源供应、管理与信息化、自动化相融合的ICS-DH供热节能管理系统。 但是&#xff0c;由…

【CMU 15-445】Proj1 Buffer Pool Manager

Buffer Pool Manager 通关记录Task1 LRU-K Replacement PolicyTask2 Disk SchedulerTask3 Buffer Pool ManagerFlushPageFlushAllPagesUnpinPageNewPageFetchPageDeletePage Optimizations CMU-15445汇总 本文对应的project版本为CMU-Fall-2023的project1 由于Andy要求&#xf…

我的AIGC部署实践03

我的AIGC部署实践03 这会是AIGC部署实践的第三回&#xff0c;用免费的GPU部署自己的stable-diffusion下面我们就开始吧。 1.创建项目 创建项目的镜像及数据集如下&#xff1a; 选择完成后点击创建&#xff0c;代码选择暂不上传。 2.初始化开发环境实例 点击最右侧的“开发…

懵了,面试官问我Redis怎么测,我哪知道!

有些测试朋友来问我&#xff0c;redis要怎么测试&#xff1f;首先我们需要知道&#xff0c;redis是什么&#xff1f;它能做什么&#xff1f; redis是一个key-value类型的高速存储数据库。 redis常被用做&#xff1a;缓存、队列、发布订阅等。 所以&#xff0c;“redis要怎么测试…

【C/C++笔试练习】内联函数、哪些运算符不能重载、拷贝构造函数、const类型、函数重载、构造函数、空类的大小、井字棋、密码强度等级

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;内联函数&#xff08;2&#xff09;哪些运算符不能重载&#xff08;3&#xff09;拷贝构造函数&#xff08;4&#xff09;const类型&#xff08;5&#xff09;函数重载&#xff08;6&#xff09;构造函数&#xff08;7&a…