首页 > 其他分享 >Lua文件加载

Lua文件加载

时间:2022-12-08 13:36:17浏览次数:35  
标签:文件 -- void Lua luaEnv public 加载

XLua只是提供Lua在Unity上运行,并没有提供热更行解决方案。

Lua文件加载

加载字符串

直接使用luaEnv.DoString()执行一个字符串,字符串必须符合Lua语法

但加载字符串这个方法不常用。

加载Lua文件

用Lua的require函数。

DoString("require '文件路径(基于Resources文件夹)'")

使用require默认从Resources下进行加载(放Resources下的lua文件得加上txt后缀)。

using UnityEngine;
using XLua;

public class Test : MonoBehaviour {
    // 创建一个Lua虚拟机
    LuaEnv luaEnv = null;

    void Start() {
        // 生成了这个虚拟机
        luaEnv = new LuaEnv();
        // 执行Lua语句
        luaEnv.DoString("print('Hello world')");
		// 执行byfile(Lua)文件
        luaEnv.DoString("require 'byfile' ");
    }
    // XLua只是提供Lua在Unity上运行,并没有提供热更行解决方案。

    void Update() {
        if (luaEnv != null)
            // 定时清理内存,luaEnv有自己的垃圾回收机制。
            luaEnv.Tick();
    }

    void OnDestroy() {
        // 手动释放掉
        luaEnv.Dispose();
    }
}

自定义加载器

使用require函数只能加载Resources文件下的文件,而Resources无法进行热更新。这时就需要用于自定义加载器。

资源热更新:

  • 服务器:制定打包工具、制定打包策略、将需要上传的资源上传到资源服务器。
  • 客户端:下载清单文件,对比hash值,一样的话读取本地,不一样下载AB包替换本地资源,并刷新hash值,提供资源管理器,根据资源路径找到对应的AB包,提取AB包中的资源。

逻辑热更新:

  • 逻辑热更新依赖于资源热更新,通过资源热更新更新对应的lua脚本内容,在LuaEnv调用之前,用户通过AddLoader添加自定义的逻辑,在自定义的逻辑中使用资源管理器调用AB包中的资源,就能够实现lua逻辑热更新。
using UnityEngine;
using System.Collections;
using XLua;

namespace Tutorial
{
    public class CustomLoader : MonoBehaviour
    {
        LuaEnv luaenv = null;
        // Use this for initialization
        void Start()
        {
            luaenv = new LuaEnv();
            luaenv.AddLoader((ref string filename) =>
            {
                if (filename == "InMemory")
                {
                    string script = "return {ccc = 9999}";
                    return System.Text.Encoding.UTF8.GetBytes(script);
                }
                return null;
            });
            luaenv.DoString("print('InMemory.ccc=', require('InMemory').ccc)");
        }

        // Update is called once per frame
        void Update()
        {
            if (luaenv != null)
            {
                luaenv.Tick();
            }
        }

        void OnDestroy()
        {
            luaenv.Dispose();
        }
    }
}

Lua调用C#脚本逻辑

// C#测试案例
using UnityEngine;
using XLua;

[LuaCallCSharp]
public class Weapon {
    public string name = "ailisi_dajian";
}

[LuaCallCSharp]
public class Hero {
    // 成员变量
    public string name = "ailisi";
    // 嵌套成员标量
    public Weapon weapon = new Weapon();

    public void cheng_yuan_fang_fa() {
        Debug.Log("C#:成员方法");
    }

    public static void jing_tai_fang_fa() {
        Debug.Log("C#:静态方法");
    }


    public string duo_fan_hui_zhi_fang_fa(ref string str) {
        return "return";
    }

}

// 防止在真机运行时lua不能调用C#
[LuaCallCSharp]
public class Warrior : Hero {
    public float Attack = 10;
}
// C#加载Lua文件
using UnityEngine;
using XLua;

public class DOLua : MonoBehaviour {
    public TextAsset lua;
    public LuaEnv luaEnv = null;
    void Start() {
        luaEnv = new LuaEnv();
        // 使用Xlua默认加载Lua脚本,需要放到Resources下
        luaEnv.DoString(lua.text);
    }

    void Update() {
        if (luaEnv != null)
            luaEnv.Tick();
    }

    void OnDestroy() {
        luaEnv.Dispose();
    }
}
-- Lua调用UnityAPI的时候每次都必须以CS开头,可以先在一个公共类中将频繁调用的类型声明出来
UnityEngine = CS.UnityEngine
GameObject = UnityEngine.GameObject
Transform = UnityEngine.Transform
Debug = UnityEngine.Debug
Hero = CS.Hero
Warrior = CS.Warrior
// Lua调用C#中的逻辑
-- 引入common公共类
require("common")

-- 创建一个GameObject
local obj = GameObject()
-- 改变GameObject名字
obj.name = "LuaCreateObj"

-- 实例化一个角色
local hero = Hero()

-- 输出角色名字
print(hero.name)
-- 输出角色武器名字
print(hero.weapon.name)
-- 使用:调用成员方法
hero:cheng_yuan_fang_fa()
-- 使用.调用静态方法
Hero.jing_tai_fang_fa()

local str ="str"
-- 多返回值成员方法
local a,b = hero:duo_fan_hui_zhi_fang_fa(str)
print(a,b)

-- 实例化一个战士
local warrior = Warrior()
-- 输出继承父类的成员变量
print(warrior.name)

XLua 配置

防止在真机情况下lua不能调用C#逻辑。

  • 打标签:用户自定义的类型可以进行打标签,系统api无法进行打标签(该方式方便,但在il2cpp下会增加不少代码,不建议使用)。

    [LuaCallCSharp]
    public class A{
    
    }
    
  • 静态列表:对于没法打标签的类型,这时可以在一个静态类里声明一个静态字段(下面是XLua框架中添加静态列表的脚本)。找到项目中ExampleGenConfig文件在里面添加指定的类型即可。

  • 动态列表

标签:文件,--,void,Lua,luaEnv,public,加载
From: https://www.cnblogs.com/wuzhongke/p/16965810.html

相关文章

  • Python实验报告——第10章 文件及目录操作
    实例01:创建并打开记录蚂蚁庄园动态的文件 在IDLE中创建一个名称为antmanor_message.py的文件,然后在该文件中,首先输出一条提示信息,然后再调用open()函数创建或打开......
  • File Support—文件支持
    Spring集成的文件支持扩展了Spring集成核心,具有专用词汇来处理读取、写入和转换文件。您需要将此依赖项包含在项目中:<dependency><groupId>org.springframework.inte......
  • (转)ext4文件系统新特性
    http://linux.chinaunix.net/bbs/thread-1059437-1-1.htmlExt4是内核版本2.6.28的重要部分。介绍Ext4是Linux文件系统的一次革命。在很多方面,Ex......
  • Mac下如何在iTerm2终端远程上传和下载Linux服务器端文件等
    参考链接:[1]http://climate2weather.cc/2019/05/20/iterms2/[2]https://github.com/snow-sprite/rzsz配置rz、sz一、本地配置在安装完iTerm2和Homebrew后brewin......
  • 用nginx缓存静态文件
      这篇教程说明你应该怎样配置nginx、设置HTTP头部过期时间,用Cache-Control中的max-age标记为静态文件(比如图片、CSS和Javascript文件)设置一个时间,这样用户的......
  • windows2019文件服务器集群,Windows Server2019 故障转移群集
    WindowsServer2019故障转移群集一、前期准备二、故障转移群集安装及设置三、iSCSI存储安装四、为每个节点添加iSCSI存储......
  • LiteOS-A内核中的procfs文件系统分析
     一、procfs介绍procfs是类UNIX操作系统中进程文件系统(processfilesystem)的缩写,主要用于通过内核访问进程信息和系统信息,以及可以修改内核参数改变系统行为。需要......
  • java springboot 大文件分片上传处理
    ​  1 背景用户本地有一份txt或者csv文件,无论是从业务数据库导出、还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工、挖掘和共创应用的时候,首先要将本地......
  • shell命令:linux进程按内存使用、CPU使用率排序,查找进程对应的可执行文件
    top命令下按键shift+M,对各进程按内存使用率排序按键shift+P,对各进程按CPU使用率排序按键C显示各进程的完整命令查找进程对应的可执行文件的路径:ls-l/proc/进程号/exe......
  • LiteOS-A内核中的procfs文件系统分析
    一、procfs介绍procfs是类UNIX操作系统中进程文件系统(processfilesystem)的缩写,主要用于通过内核访问进程信息和系统信息,以及可以修改内核参数改变系统行为。需要注意的是......