热更新解决方案5——toLua

概述

Tolua框架导入和AB包相关准备

结合视频进行项目资源导入。

C#调用Lua

1.toLua解析器

2.toLua解析器自定义解析方式

自定义路径

自定义解析方式

using System.Collections;
using System.Collections.Generic;
using LuaInterface;
using UnityEngine;

public class LuaCustomLoader : LuaFileUtils
{
    public override byte[] ReadFile(string fileName)
    {
        //Debug.Log("自定义解析方式" + fileName);
        //如果想要重新定义 解析lua的方式 那么只需要在该函数中去写逻辑即可

        //如果没有lua后缀 加上lua后缀 不管是从AB包中加载还是从res下加载 都不支持用.lua后缀 
        //所以tolua加上了bytes后缀
        //我们自己可以加上.txt后缀
        if(!fileName.EndsWith(".lua")){
            fileName += ".lua";
        }
        byte[] buffer = null;
        //因为 进行热更新的lua代码 肯定是我们自己写的上层lua逻辑
        //第二种 从AB包中加载lua文件
        //CSharpCallLua/Lesson2_Loader这样的名字 但是在AB包中我们只需要文件名 所以需要拆分一下
        string[] strs = fileName.Split('/');
        //加载AB包中的lua文件
        TextAsset luaCode = ABMgr.GetInstance().LoadRes<TextAsset>("lua", strs[strs.Length - 1]);
        if(luaCode != null){
            buffer = luaCode.bytes;
            Resources.UnloadAsset(luaCode);
        }
        
        //toLua的自带逻辑和自带lua类 我们不太需要去热更新 直接从resources下 去加载即可
        if(buffer == null){
            //第一种 从resources中加载lua文件
            //先要通过 窗口的Lua ——> Copy Lua files to Resources 将lua文件加载到res文件下
            //注意:它只能把lua文件夹下的自定义文件拷贝到res下
            string path = "Lua/" + fileName;
            TextAsset text = Resources.Load<TextAsset>(path);
            if(text != null){
                buffer = text.bytes;
                //卸载使用后的 文本资源
                Resources.UnloadAsset(text);
            }
        }
        
        return buffer;
    }
}

3.toLua解析器管理器

using System.Collections;
using System.Collections.Generic;
using LuaInterface;
using UnityEngine;

/// <summary>
/// 学习的主要目标 通过LuaMgr来管理唯一的一个toLua解析器
/// 要把该管理器 做成一个 继承了mono的 单例模式对象 因为之后的知识点 需要用到它的特性
/// </summary>
public class LuaMgr : SingletonAutoMono<LuaMgr>
{
    private LuaState luaState;

    public void Init(){
        //最后打包的时候 再用 再取消注释
        //new LuaCustomLoader();
        //就是初始化 唯一的 luaState
        luaState = new LuaState();
        luaState.Start();

        //后面有些东西没写 当我们学习到对应知识点时 再来写
        //委托初始化相关

        //协程相关

        //Lua使用Unity中的类相关

    }

    /// <summary>
    /// 该属性可以让外部获取到 解析器
    /// </summary>
    /// <value></value>
    public LuaState LuaState{
        get{
            return luaState;
        }
    }

    /// <summary>
    /// 提供一个外部执行 lua语法字符串的 方法
    /// </summary>
    /// <param name="str">lua语法字符串</param>
    /// <param name="chunkName">执行出处</param>
    public void DoString(string str, string chunkName = "LuaMgr.cs"){
        luaState.DoString(str, chunkName);
    }

    /// <summary>
    /// 执行指定名字的lua脚本
    /// </summary>
    /// <param name="fileName"></param>
    public void Require(string fileName){
        luaState.Require(fileName);
    }

    /// <summary>
    /// 销毁lua解析器
    /// </summary>
    public void Dispose(){
        if(luaState == null)
            return;
        
        luaState.CheckTop();
        luaState.Dispose();
        luaState = null;
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值