luaframework是啥文件夹
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luaframework是啥文件夹相关的知识,希望对你有一定的参考价值。
一、什么是LuaFramework?答:基于SimpleFramework + tolua # 基础上,重新构造的新框架。框架内自带了LuaBundle模式(将Lua文件打包进Assetbundle) + 重构的资源管理器。
两大版本:
LuaFramework_NGUI:GitHub下载地址
LuaFramework_UGUI:GitHub下载地址
注:受限制于Unity在不断的版本更新中,Assetbundle的内部变更与机制更新,Github上作者LuaFramework也需要跟随版本进行填充内容,优化源码等,但更新已经跟不上Unity更新速度。使用中需要选择对应Unity版本的LuaFramework。解决的方法是,开发者自主基于现有框架添加新的机制和功能。或自主开发Lua框架以应对Unity各版本。
二、目的
理解LuaFramework原理。能够轻松自主开发框架或基于现有框架更新。
三、查看Lua项目
从Github上下载的LuaFramework,是一个完整的项目包。里面关于Lua的内容使用的均为绝对路径。在尚未清楚Lua的原理前,拖进至其他项目之中,会出现无法使用等报错原因。故Unity新建添加该项目。
其他:
Opening Project in Non-Matching Editor Installasion - 选择 “Continue”
API Update Required - 选择 “I Made a Backup. Go Ahead!”
一些问题: 2020版本无法打开。经检查目前LuaFramework仅提供2017/2018/2019的版本支持。在转2019版本时,出现反复加载某一段资源,长时间无法结束加载的情况。
3.1 操作流程(简)
打开Project窗口下 Framework->Scenes->mian场景:Hierarchy窗口下的GameManager对象上挂载有Main.cs。
第一次运行:[报错]没有找到框架所需要的资源,单击Game菜单下Build XXX Resources生成!
查看菜单栏:菜单栏上有 “LuaFramework” 和 "Lua"两新增菜单
打开Menu栏下 LuaFramework->Build Windows Resource:点击后,会在Project窗口新生成一个StreamingAssets目录。(注意:不同平台的Resource不一,根据需求平台进行选择。)
第二次运行:Game窗口出现由Lua实现的UI。
查看Console:梳理过程
3.2 流程梳理
前提操作:清理无用的DeBug
消息 描述 自上而下
Init lua state 初始化 LuaState
Register lua type cost time: XXX 注册 lua type 所耗费的时长
Initialize OK! 初始化完成
LuaState start 启用LuaState
[tolua.lua:11]:version20100 jit: XXX XXX 及时编译器版本信息
[tolua.lua:12]:os: Windows, arch: x64 Windows x64
[Main.lua:3]:logic start
3.3 MVC框架
参照LuaFramework->Scripts->Framework
M:Manager.cs
V:View.cs
C:Controller.cs
3.4 实现
参照LuaFramework->Scripts
3.4.1 关于Manager
GameManager:实现热更新的流程(关于实现的机制)
ResourceManager:从Assetsbundler中获取指定的Assets
LuaManager:初始化Lua语句来执行与Lua相关的内容
3.4.2 关于View
AppView(未被使用)
3.4.3 关于Controller
StartUpCommand:初始化管理器
3.5 打包
重新LuaFramework -> Build Window Resource
3.6 调试
变更AppConst.cs:2中的LuaBundleMode为Fasle
3.7 准备服务器
在服务器本地目录下新建命名文件夹,这里取名Lua_Test。
在新建目录Lua_Test下新建两个文件夹,分别取名为Release和Web。
Web:放置更新资源
Release:放置需要热更新的程序
将生成的StreamingAsset目录放置入Web目录中(也可是目录中整个文件)
使用Microsoft Edge或其他浏览器访问服务器
访问本地IP:http://local
访问局域网IP:http://192.168.0.1
访问远程服务器IP:http://IP
访问目录文件files.txt
IP地址:http://远程服务器IP/StreamingAssets/files.txt
搭建完成
四、热更新原理
Unity的热更新需要涉及到3个目录:
流程:
操作①仅第一次操作出现,是将游戏包资源文件拷贝至数据目录(后续将不再执行)
操作②请求网络资源,检查是否更新资源
操作③启动游戏程序
4.1 游戏资源目录:
包含Unity工程中StreamingAssets文件夹下的文件。安装游戏之后,这些文件将被复制到目标机器上特定的文件夹内。
注意:不同平台下的目录路径不一。
平台 路径
Mac OS或Windows Application.dataPath + "/StreamingAssets"
ios Application.dataPath + "/Raw"
android "jar:file://" + Application.dataPath + "!/assets/"
4.2 数据目录
“游戏资源目录”在Andriod、IOS上只读,无法将下载更新的资源放置其中。需建立一个“数据目录”,该目录可读写。
在第一次启动游戏后,程序会将“游戏资源目录”的内容复制到“数据目录中”。操作①
游戏过程中的资源加载,都将从“数据目录”中获取、解包。操作③
注意:不同平台下的目录路径不一。
平台 路径
Mac OS或Windows C:/LuaFramework/"
Android或IOS Application.persistendDataPath + "/LuaFramework""
调试模式下 Application.dataPath + “/StreamingAssets/”
4.3 网络资源地址
存放游戏资源的网址,游戏开始后,程序会从网络资源地址下载一些更新的文件到数据目录。
此目录下包含不同版本的资源文件,以及用于版本控制的files.txt。程序会优先下载此文件,然后与“数据目录”中文件的MD5码作比较,更新有变化的文件。操作②
LuaFramework的热更新代码定义在Assets\LuaFramework\Scripts\Manager\GameManager.cs【根据实际情况配置路径】
释放资源
//释放资源
void CheckExtractResource()
bool isExists = Dictionary.Exists(Util.DataPath)
&& Dictionary.Exists(Util.DataPath + "lua/")
&& Dictionary.Exists(Util.DataPath + "lua/");
if (isExists || AppConst.DebugMode)
StartCoroutine(OnUpdateResource());
return;
StartCoroutine(OnExtractResource()); //启用释放协议
IEnumerator OnExtractResource()
string dataPath = Util.DataPath; //数据目录
string resPath = Util.AppContentPath(); //游戏包资源目录
if(Directory.Exists(dataPath) && Directory.Delet(dataPath, true))
Directory.CreateDirectory(dataPath);
登录后复制

启用更新资源
IEnumerator OnUpdateMode()
if(!AppConst.UpdateMode)
OnResourceInited();
yield break;
string dataPath = Util.DataPath; //数据目录
string url = AppConst.WebUrl;
string message = string.Empty;
string random = DateTime.Now.ToString("yyyymmddhhmmss");
string listUrl = url + "files.txt?v=" + random;
Debug.LogWarning("LoadUpdate ——> " + listUrl);
WWW www = new WWW(listUrl);
yield return www;
if(www.error != null)
OnUpdateFaild(string.Empty);
yield break;
登录后复制

五、代码热更新
5.1 修改配置
LuaFramework框架默认配置是从本地加载文件。需要打开AppConst.cs文件,
将UpdateMode设置为true,启用更新模式
将LuaBundleMode设置为true,启用热更新模式
修改WebUrl下的路径为对应服务器地址
5.2 配置"网络资源"
打开服务器,将工程项目中StreamingAssets里的所有内容复制到服务器上(必要时配置权限,让所有文件可下载)
5.3 测试热更新
修改Lua脚本(如将HelloLua改为LuaLuaLua)
点击Build Windows Resource
将"工程目录/StreamingAseets"里面的所有文件复制到服务器上。
再修改Lua脚本内容,覆盖本地资源。运行游戏,程序中出现"LuaLuaLua From Server"即证明网上拉去文件成功。
5.4 打包代码资源
File -> Build Setting -> PlayerSetting 更改相关描述
Build并上传至 服务器的Release目录下
5.5 上传代码资源
LuaFramework -> Build Windows Resource 更新Lua
将资源中新生成的StreamingAssets上传至 服务器Web目录下
5.6 其他Lua操作
Main.Lua
--主入口函数。 从此处开始Lua逻辑
local GameObject = UnityEngine.GameObject
function Main()
print("Logic Start")
local go = GameObject("test") --创建对象
go.transfrom.position = Vector3.one --设置坐标为(1,1,1)
end
登录后复制
Lua中使用.是极消耗性能,不提倡。如local go = UnityEngine.GameObject("Test"),应选择提前声明准备,如local GameObject = UnityEngine.GameObject,后续调用如local go = GameObject("Test")来降低性能消耗。
六、资源热更新
6.1 准备框架
参数设置:
设置AppConst.cs中ExampleMode为false(案例Lua,对正式打包无用)
设置AppConst.cs中LuaBundleMode为true(解决资源管理器中出现Lua文件,将其打包成Unity3D文件)
流程:
创建GameObject对象命名为"GameManager"(命名有严格要求,若更改须变更代码内容)
在GameManager游戏对象上添加(挂载)Main.cs脚本
在GameManager游戏对象上添加(挂载)Console.cs脚本(非LuaFramework内脚本,可忽略)
运行-检查有无报错
6.2 添加模型资源
向场景中添加若干模型资源。对必要操作模型创建Prefab预制体,放置对应资源文件夹内。
在LuaFramework框架下,Packager.cs内第77行添加如下代码:
//添加自定义资源
//AddBuildMap为脚本内提供方法 参数分别为 生成的Assetbundle文件名称 、 打包文件类型 、 文件目录
AddBuildMap("Tank" + AppConst.ExtName, "*.prefab", "Assets/Tanks/Prefabs")
登录后复制
6.3 打包模型资源
File -> Build Setting -> PlayerSetting 更改相关描述
Build并上传至 服务器的Release目录下
6.4 检查(可忽略)
--主入口函数。 从此处开始Lua逻辑
local GameObject = UnityEngine.GameObject
function Main()
print("Logic Start")
local luaHelper = LuaFramework.LuaHelper
local resMgr = luaHelper.GetResManager()
--参数 Assetbundle名字 资源名字 加载方法
resMger:LoadPrefab("Tank", "TankPrefab",OnLoaded) --LoadPrefab是实例方法,故使用 :
end
function OnLoaded(objs)
print("OnLoaded " .. type(objs))
end
6.5 上传模型资源
LuaFramework -> Build Windows Resource 更新Lua
将资源中新生成的StreamingAssets上传至 服务器Web目录下 参考技术A 在热更新核心脚本【LuaBehaviour】。
LuaBehaviour继承自View 视图层
我们只需要关注生成的【函数名】、【参数列表】、【返回值】,怎么生成的不需要知道
我们核心目的是看框架逻辑。
LuaBehaviour这个脚本,是所有面板都会挂载的一个脚本【误?】
一出现这个面板就会执行Awake方法
把当前对象名 , 要执行的方法名,当前这个对象传入到CallMethod中
String module 是当前游戏对象的名字,
String func 是要执行的方法,
Params object[] args 可变参数的object类型
这一句获取了一个Lua管理器,我们也不关心是怎么获取的,反正就是获取到了
CallFunction里面的就是【当前游戏对象名字.点上一个传入的方法名】
以上就是对Lua文件,是如何在C#这边进行一个小处理
正片
CtrlManager.lua
要在这里进行写要进行加载的面板,例如,我们要在这里加载Main面板和Role面板
添加进去之后,它会进行判断这个控制器为不为空,不为空并且ExampleMode = 1 然后就去执行这个控制器里面的Awake函数【执行到了控制器中的Awake的方法就可以执行一系列的方法】
这个Awake函数,用面板管理器【PanelManager】去创建一个面板 ( CreatePanel 是 面板管理器的一个方法,这个C#那边注册好的Wrap文件【包装】 )
panelMgr:CreatePanel(‘Prompt’, this.OnCreate );
【第一个形参指的是要创建出来的面板名 – 无需加Panel -
,this.OnCreate是每个控制器它自己的一个方法】
跳转到C#那边的PanelManager类
一旦这个面板加载成功,
【这一部分是加载面板】
它在后面走到下面【这行代码】
Func是那边传过来的lua的一个方法,它会调用call方法,里面的go是加载出来的这个GameObject
然后到了lua的这边, 参考技术B 它这里有个Awake和OnDestroy都是由LuaBehaviour来调用的,它会调用这些东西的
掉完Awake会把这些对象都拿到,到了InitPanel这个方法都是来获取底下的控件,然后存入这个Table里面。
回到MainCtrl
获取自身的LuaBehaviour脚本,拿到LuaBehaviour,然后调用AddClick添加事件监听,再拿到MainPanel里面存在的那个btn,再调用自身的OnClick函数
以上是关于luaframework是啥文件夹的主要内容,如果未能解决你的问题,请参考以下文章
游戏开发高阶从零到一教你Unity使用ToLua实现热更新(含Demo工程 | LuaFramework | 增量 | HotUpdate)
游戏开发高阶从零到一教你Unity使用ToLua实现热更新(含Demo工程 | LuaFramework | 增量 | HotUpdate)