资源管理(18)从AssetBundle中加载xLua脚本启动xLua框架

表格加载完毕会调用lua脚本的初始化

 

 

 

从自定义的loader中加载

LuaManager完整代码

 public class LuaManager : ManagerBase
    {
        /// <summary>
        /// 全局的xLua引擎
        /// </summary>
        public static LuaEnv luaEnv;


        /// <summary>
        /// 初始化
        /// </summary>
        public void Init()
        {
            //1. 实例化 xLua引擎
            luaEnv = new LuaEnv();

#if ASSETBUNDLE
            //2.添加自定义Loader
            luaEnv.AddLoader(MyLoader);

            //3.加载Bundle
            LoadLuaAssetBundle();
#else
            //2.设置xLua的脚本路径
            luaEnv.DoString(string.Format("package.path = '{0}/?.bytes'", Application.dataPath + "/Download/xLuaLogic/"));
            DoString("require 'Main'");
#endif
        }

        /// <summary>
        /// 当前xLua脚本的资源包
        /// </summary>
        private AssetBundle m_CurrAssetBundle;

        /// <summary>
        /// 加载xLua的AssetBundle
        /// </summary>
        private void LoadLuaAssetBundle()
        {
            //XLua的AssetBundle的存储路径
            GameEntry.Resource.ResourceLoaderManager.LoadAssetBundle(ConstDefine.XLuaAssetBundlePath, onComplete: (AssetBundle bundle) =>
            {
                m_CurrAssetBundle = bundle;
                //然后执行Main.lua,如果没有main.lua,就会去loader中加载
                DoString("require 'Main'");
            });

        }

        /// <summary>
        /// 自定义的Loader
        /// </summary>
        /// <param name="filepath"></param>
        /// <returns></returns>
        private byte[] MyLoader(ref string filepath)
        {
            byte[] buffer = null;
            //所有的lua脚本都会进bundle包,跟资源一样会取最后一个名称
            string path = GameEntry.Resource.GetLastPathName(filepath);
            //Debug.Log(path);
            //加载资源,从资源包中加载
            TextAsset asset = m_CurrAssetBundle.LoadAsset<TextAsset>(path);
            buffer = asset.bytes;
            //如果加载出来前三位是239,187,192,说明有bom头,把bom头去掉
            if (buffer[0] == 239 && buffer[1] == 187 && buffer[2] == 191)
            {
                //处理UTF-8 BOM头
                buffer[0] = buffer[1] = buffer[2] = 32;
            }
            Debug.Log("加载成功 Lua文件=>" + asset.name);

            return buffer;
        }

        /// <summary>
        /// 执行Lua脚本
        /// </summary>
        /// <param name="str"></param>
        public void DoString(string str)
        {
            luaEnv.DoString(str);
        }
    }

从lua中加载数据表

 

 

BaseAction,使用BaseAction委托把MMO_MemoryStream返回到lua中去

using XLua;


namespace YouYou
{
    [CSharpCallLua]
    public delegate void BaseAction();

    [CSharpCallLua]
    public delegate void BaseAction<T1>(T1 t1);

    [CSharpCallLua]
    public delegate void BaseAction<T1, T2>(T1 t1, T2 t2);

    [CSharpCallLua]
    public delegate void BaseAction<T1, T2, T3>(T1 t1, T2 t2, T3 t3);

    [CSharpCallLua]
    public delegate void BaseAction<T1, T2, T3, T4>(T1 t1, T2 t2, T3 t3, T4 t4);

    [CSharpCallLua]
    public delegate void BaseAction<T1, T2, T3, T4, T5>(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5);

    [CSharpCallLua]
    public delegate void BaseAction<T1, T2, T3, T4, T5, T6>(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6);

    [CSharpCallLua]
    public delegate void BaseAction<T1, T2, T3, T4, T5, T6, T7>(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7);


    [CSharpCallLua]
    public delegate R BaseFunc<out R>();

    [CSharpCallLua]
    public delegate R BaseFunc<T1, out R>(T1 t1);
}

Lua中进行改造,调用C#中的LoadDataTable加载表格,加载完之后返回MMO_MemoryStream,然后存入ChapterEntity中

加载完之后发送一个消息

在ProcedurePreload中有监听

数据表全部加载完毕

最后附上 GameInit.bytes和 ChatperDBModel.bytes脚本

print('启动GameInit')
require "Common/Define"
require "Common/SysEventId"
require "Common/UIFormId"

GameInit = {};
local this = GameInit;



function GameInit.Init()
	this.InitCtrlAndViews();
	this.LoadDataTables();
	this.InitProto();
end

function GameInit.InitCtrlAndViews()

	--一个模块
	require('Modules/Task/UI_TaskCtrl');
	require('Modules/Task/UI_TaskView');

	--一个模块
	require('Modules/Loading/UI_LoadingCtrl');
	require('Modules/Loading/UI_LoadingView');
end

function GameInit.LoadDataTables()
	--章表
	require('DataNode/DataTable/Create/ChapterEntity');
	require('DataNode/DataTable/Create/ChapterDBModel');
	ChapterDBModel.LoadList();

	--测试用的
	local row=ChapterDBModel.GetEntity(1);
	print(row.ChapterName);

	--任务表
	require('DataNode/DataTable/Create/TaskEntity');
	require('DataNode/DataTable/Create/TaskDBModel');
	TaskDBModel.LoadList();
end

local m_TotalTableCount = 0; --总共需要加载的表格数量
local m_CurrLoadTableCount =0;  --当前已加载的表格数量

--总共需要加载的表格数量++
function GameInit.AddTotalLoadTableCount()
	m_TotalTableCount = m_TotalTableCount + 1;
end

--单个数据表加载完毕回调
function GameInit.LoadOneTableComplete()
	--当前已加载的表格数量++
	m_CurrLoadTableCount = m_CurrLoadTableCount + 1;

	if(m_TotalTableCount==m_CurrLoadTableCount) then
		--所有数据表加载完毕
		GameEntry.Event.CommonEvent:Dispatch(SysEventId.LoadLuaDataTableComplete);
	end
end

--初始化通讯协议
function GameInit.InitProto()
	require("Common/json");
	require('DataNode/Proto/ProtoCodeDef');
	require('DataNode/ProtoHandler/SocketProtoListenerForLua');
	SocketProtoListenerForLua.AddProtoListener();
end

 

--数据访问
ChapterDBModel = { }

local this = ChapterDBModel;

local chapterTable = { }; --定义表格

function ChapterDBModel.LoadList()
    --开始加载的时候总数目加1
    GameInit.AddTotalLoadTableCount();
    CS.YouYou.GameEntry.Lua:LoadDataTable("Chapter", this.LoadFormMS);
end

function ChapterDBModel.LoadFormMS(ms)
    local rows = ms:ReadInt();
    ms:ReadInt();

    for i = 0, rows, 1 do
        chapterTable[#chapterTable + 1] = ChapterEntity.New(
                ms:ReadInt(),
                ms:ReadUTF8String(),
                ms:ReadInt(),
                ms:ReadUTF8String(),
                ms:ReadFloat(),
                ms:ReadFloat()
        );
    end
    --告诉GameInit某一个表加载完毕了,当前数目+1
    GameInit.LoadOneTableComplete();
end

function ChapterDBModel.GetList()
    return chapterTable;
end

function ChapterDBModel.GetEntity(id)
    local ret = nil;
    for i = 1, #chapterTable, 1 do
        if (chapterTable[i].Id == id) then
            ret = chapterTable[i];
            break;
        end
    end
    return ret;
end

最后事件系统进行过优化

对应的SocketEvent也做了对应的修改

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值