uluaFramework--框架简单介绍
uluaFramework 下载地址:
git clone https://github.com/jarjin/LuaFramework_UGUI.git
框架配置
public class AppConst
{public const bool DebugMode = false; //调试模式-用于内部测试/// <summary>/// 如果想删掉框架自带的例子,那这个例子模式必须要/// 关闭,否则会出现一些错误。/// </summary>public const bool ExampleMode = true; //例子模式 /// <summary>/// 如果开启更新模式,前提必须启动框架自带服务器端。/// 否则就需要自己将StreamingAssets里面的所有内容/// 复制到自己的Webserver上面,并修改下面的WebUrl。/// </summary>public const bool UpdateMode = false; //更新模式-默认关闭 public const bool LuaByteMode = false; //Lua字节码模式-默认关闭 public const bool LuaBundleMode = true; //Lua代码AssetBundle模式public const int TimerInterval = 1;public const int GameFrameRate = 30; //游戏帧频public const string AppName = "LuaFramework"; //应用程序名称public const string LuaTempDir = "Lua/"; //临时目录public const string AppPrefix = AppName + "_"; //应用程序前缀public const string ExtName = ".unity3d"; //素材扩展名public const string AssetDir = "StreamingAssets"; //素材目录 public const string WebUrl = "http://localhost:6688/"; //测试更新地址public static string UserId = string.Empty; //用户IDpublic static int SocketPort = 0; //Socket服务器端口public static string SocketAddress = string.Empty; //Socket服务器地址public static string FrameworkRoot{get{return Application.dataPath + "/" + AppName;}}
}
游戏主入口
/// </summary>
public class Main : MonoBehaviour
{void Start(){AppFacade.Instance.StartUp(); //启动游戏}
}
通过StartUp添加游戏控制组件
GameObject gameMgr = GameObject.Find("GlobalGenerator");
if (gameMgr != null)
{AppView appView = gameMgr.AddComponent<AppView>();
}
//-----------------关联命令-----------------------
AppFacade.Instance.RegisterCommand(NotiConst.DISPATCH_MESSAGE, typeof(SocketCommand));//-----------------初始化管理器-----------------------
AppFacade.Instance.AddManager<LuaManager>(ManagerName.Lua);
AppFacade.Instance.AddManager<PanelManager>(ManagerName.Panel);
AppFacade.Instance.AddManager<SoundManager>(ManagerName.Sound);
AppFacade.Instance.AddManager<TimerManager>(ManagerName.Timer);
AppFacade.Instance.AddManager<NetworkManager>(ManagerName.Network);
AppFacade.Instance.AddManager<ResourceManager>(ManagerName.Resource);
AppFacade.Instance.AddManager<ThreadManager>(ManagerName.Thread);
AppFacade.Instance.AddManager<ObjectPoolManager>(ManagerName.ObjectPool);
AppFacade.Instance.AddManager<GameManager>(ManagerName.Game);
GameManager
游戏主要运行逻辑入口
检擦资源文件—首次运行时将StreamingAssets文件解压到PresidentData文件夹下,然后比对files.txt文件内容,与远程服务器版本信息比对,添加下载文件任务。
public void CheckExtractResource()
{bool isExists = Directory.Exists(Util.DataPath) &&Directory.Exists(Util.DataPath + "lua/") && File.Exists(Util.DataPath + "files.txt");if (isExists || AppConst.DebugMode) {StartCoroutine(OnUpdateResource());return; //文件已经解压过了,自己可添加检查文件列表逻辑}StartCoroutine(OnExtractResource()); //启动释放协成
}
文件解压过程
IEnumerator OnExtractResource()
{string dataPath = Util.DataPath; //数据目录string resPath = Util.AppContentPath(); //游戏包资源目录if (Directory.Exists(dataPath)) Directory.Delete(dataPath, true);Directory.CreateDirectory(dataPath);string infile = resPath + "files.txt";string outfile = dataPath + "files.txt";if (File.Exists(outfile)) File.Delete(outfile);string message = "正在解包文件:>files.txt";Debug.Log(infile);Debug.Log(outfile);if (Application.platform == RuntimePlatform.Android){WWW www = new WWW(infile);yield return www;if (www.isDone){File.WriteAllBytes(outfile, www.bytes);}yield return 0;}else File.Copy(infile, outfile, true);yield return new WaitForEndOfFrame();//释放所有文件到数据目录string[] files = File.ReadAllLines(outfile);foreach (var file in files){string[] fs = file.Split('|');infile = resPath + fs[0]; //outfile = dataPath + fs[0];message = "正在解包文件:>" + fs[0];Debug.Log("正在解包文件:>" + infile);facade.SendMessageCommand(NotiConst.UPDATE_MESSAGE, message);string dir = Path.GetDirectoryName(outfile);if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);if (Application.platform == RuntimePlatform.Android){WWW www = new WWW(infile);yield return www;if (www.isDone){File.WriteAllBytes(outfile, www.bytes);}yield return 0;}else{if (File.Exists(outfile)){File.Delete(outfile);}File.Copy(infile, outfile, true);}yield return new WaitForEndOfFrame();}message = "解包完成!!!";facade.SendMessageCommand(NotiConst.UPDATE_MESSAGE, message);yield return new WaitForSeconds(0.1f);message = string.Empty;//释放完成,开始启动更新资源StartCoroutine(OnUpdateResource());
}
文件下载
这里采用的是单线程同步下载,后期项目中可以根据需求改成多线程异步下载方式
IEnumerator OnUpdateResource()
{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){OnUpdateFailed(string.Empty);yield break;}if (!Directory.Exists(dataPath)){Directory.CreateDirectory(dataPath);}File.WriteAllBytes(dataPath + "files.txt", www.bytes);string filesText = www.text;string[] files = filesText.Split('\n');for (int i = 0; i < files.Length; i++){if (string.IsNullOrEmpty(files[i])) continue;string[] keyValue = files[i].Split('|');string f = keyValue[0];string localfile = (dataPath + f).Trim();string path = Path.GetDirectoryName(localfile);if (!Directory.Exists(path)){Directory.CreateDirectory(path);}string fileUrl = url + f + "?v=" + random;bool canUpdate = !File.Exists(localfile);if (!canUpdate){string remoteMd5 = keyValue[1].Trim();string localMd5 = Util.md5file(localfile);canUpdate = !remoteMd5.Equals(localMd5);if (canUpdate) File.Delete(localfile);}if (canUpdate){ //本地缺少文件Debug.Log(fileUrl);message = "downloading>>" + fileUrl;facade.SendMessageCommand(NotiConst.UPDATE_MESSAGE, message);/*www = new WWW(fileUrl); yield return www;if (www.error != null) {OnUpdateFailed(path); //yield break;}File.WriteAllBytes(localfile, www.bytes);*///这里都是资源文件,用线程下载BeginDownload(fileUrl, localfile);while (!(IsDownOK(localfile))) { yield return new WaitForEndOfFrame(); }}}yield return new WaitForEndOfFrame();message = "更新完成!!";facade.SendMessageCommand(NotiConst.UPDATE_MESSAGE, message);OnResourceInited();
}
资源更新后回调,去加载Assetbunle中的AssetBundleManifest,同时执行LuaManager中的InitStart方法,确定lua加载路径,关于ulua如果映射C#到lua 可以去源码了解一下
public void OnResourceInited()
{ResManager.Initialize(AppConst.AssetDir, delegate (){Debug.Log("Initialize OK!!!");this.OnInitialize();});
}
void OnInitialize()
{LuaManager.InitStart();LuaManager.DoFile("Logic/Game"); //加载游戏LuaManager.DoFile("Logic/Network"); //加载网络NetManager.OnInit(); //初始化网络Util.CallMethod("Game", "OnInitOK"); //初始化完成
}
加载Game.lua 和Network.lua文件后,通过LuaMangager中的CallFunction 方法调用Lua脚本中的方法
uluaFramework--框架简单介绍相关推荐
- Django - Django框架 简单介绍
Django框架 简单介绍 本文地址: http://blog.csdn.net/caroline_wendy/article/details/29172271 1. 介绍 Django是一个开放源码 ...
- soul框架简单介绍与设计模式分析
soul框架简单介绍与设计模式分析 1. 初识 1.1 查看官网文档了解 1.2. 目标: 2. 分析源码 2.1. 网关的实现原理 2.1.1. 跨域请求问题 2.1.2. 网关请求处理 2.1.3 ...
- Rebound动画框架简单介绍
Rebound动画框架简单介绍 Android菜鸟一枚,有不对的地方希望大家指出,谢谢. 最近在接手了一个老项目,发现里面动画框架用的是facebook中的Rebound框架,由于以前没听说过,放假时 ...
- 【修真院Java小课堂】Tiles框架简单介绍
大家好,我是IT修真院上海分院第6期的学员,一枚正直纯洁善良的程序员 今天给大家分享一下,Tiles框架简单介绍 Tiles框架简单介绍 背景介绍 什么是Tiles Tiles 是一种JSP布局框架, ...
- Spring 框架简单介绍
考虑到你可能不熟悉 Spring,我这里对它做下简单介绍.我们常说的 Spring 框架,是指 Spring Framework 基础框架.Spring Framework 是整个 Spring 生态 ...
- 玩转人工智能(3)常用的大数据框架简单介绍
时光不老,我们不散. 讲大数据框架前,简单的介绍下大数据的文化.信息时代人类社会的进步得益于分享和开源.大数据时代属于信息时代的第三代发展阶段(2001年到2011年可以认为是CT行业的黄金期,200 ...
- 朝花夕拾之socket的基本使用以及mina框架简单介绍
工欲善其事,必先利其器,从互联网诞生到现在,基本上所有的程序都是网络程序,很少有单机版的程序了. 而网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机.我们现在进行网络编程 ...
- Dbutil框架简单介绍
Dbutil框架 Dbutil介绍 l commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...
- jQuery框架简单介绍
jQuery框架介绍 1. jQuery框架与javaScript之间的有什么关系? 2. jQuery与原生javaSript对比,有什么优点? 3. jQuery与javaScript之间的区别是 ...
- Tiles框架简单介绍
大家好,今天给大家分享一下,Tiles框架 一.Tiles框架作用简介 我们在写网页的时候,经常会遇见多个网页复用同样的代码,比如CSDN的菜单栏,顶部栏等,如果在每个页面中都复制粘贴,虽然说也可以实 ...
最新文章
- 最全pandas函数用法速查手册(高清版)
- HarmonyOS之基础环境和应用开发流程
- K-periodic Garland CodeForces - 1353E(贪心)
- Java修炼之路——基础篇——平台无关性
- 笔试常见的智力题(附答案)
- linux系统平均价格,简单认识Linux系统平均负载
- 实现一个靠左靠右靠中间的listview
- 计算机体系结构与组成的区别
- 电信机顶盒怎么连接鸿蒙系统电视,电信机顶盒的密码是多少,怎么改密码
- Flink Forward Asia Hackathon (2021) 回顾
- indesign怎么拼图_用R来拼图和排版,告别AI和PS(二):调节宽度和高度
- R语言ggplot2可视化多项式曲线、多项式方程以及多项式模型评估指标R方:使用ploynom包拟合三阶多项式模型
- 15微型计算机系统不包括,全国2002年10月自学考试计算机应用基础真题
- ROS加强精通过程--禁止 未授权用户上网
- 在windows11上安装cuda,cudnn,以及GPU版的pytorch
- 正方教务隐藏入口_正方教务系统小功能操作手册
- 文档服务器备份策略,服务器备份策略
- error C2065: “IDD_DIALOG1”: 未声明的标识符 .
- 华为P20 如时升Android 9.0,冬日如何保持好身材?升级EMUI9.0的华为P20系列有妙招...
- 计算机网络网络适配器的作用是什么原因,网络适配器的作用_网络适配器删了怎么办...
热门文章
- calwrf编译linux红帽,WRF模式运行手册
- source 命令与./命令
- Codeforces Round 250(Div. 2)
- simulink中的变压器参数解释及测量方法
- php openssl支持的加密算法和加密模式及加密解密示范实例
- 监理工程师岁月--甲乙丙方的斗智斗勇
- Pythonshellcode编码+混淆免杀
- FileUpload解析
- 29.【C语言】进制转换:10转16、10转2、2转10、16转10(Demo)
- java计算机毕业设计-游戏账号交易平台-演示录像-源码+数据库+系统+lw文档+mybatis+运行部署