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--框架简单介绍相关推荐

  1. Django - Django框架 简单介绍

    Django框架 简单介绍 本文地址: http://blog.csdn.net/caroline_wendy/article/details/29172271 1. 介绍 Django是一个开放源码 ...

  2. soul框架简单介绍与设计模式分析

    soul框架简单介绍与设计模式分析 1. 初识 1.1 查看官网文档了解 1.2. 目标: 2. 分析源码 2.1. 网关的实现原理 2.1.1. 跨域请求问题 2.1.2. 网关请求处理 2.1.3 ...

  3. Rebound动画框架简单介绍

    Rebound动画框架简单介绍 Android菜鸟一枚,有不对的地方希望大家指出,谢谢. 最近在接手了一个老项目,发现里面动画框架用的是facebook中的Rebound框架,由于以前没听说过,放假时 ...

  4. 【修真院Java小课堂】Tiles框架简单介绍

    大家好,我是IT修真院上海分院第6期的学员,一枚正直纯洁善良的程序员 今天给大家分享一下,Tiles框架简单介绍 Tiles框架简单介绍 背景介绍 什么是Tiles Tiles 是一种JSP布局框架, ...

  5. Spring 框架简单介绍

    考虑到你可能不熟悉 Spring,我这里对它做下简单介绍.我们常说的 Spring 框架,是指 Spring Framework 基础框架.Spring Framework 是整个 Spring 生态 ...

  6. 玩转人工智能(3)常用的大数据框架简单介绍

    时光不老,我们不散. 讲大数据框架前,简单的介绍下大数据的文化.信息时代人类社会的进步得益于分享和开源.大数据时代属于信息时代的第三代发展阶段(2001年到2011年可以认为是CT行业的黄金期,200 ...

  7. 朝花夕拾之socket的基本使用以及mina框架简单介绍

    工欲善其事,必先利其器,从互联网诞生到现在,基本上所有的程序都是网络程序,很少有单机版的程序了. 而网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机.我们现在进行网络编程 ...

  8. Dbutil框架简单介绍

    Dbutil框架 Dbutil介绍 l commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...

  9. jQuery框架简单介绍

    jQuery框架介绍 1. jQuery框架与javaScript之间的有什么关系? 2. jQuery与原生javaSript对比,有什么优点? 3. jQuery与javaScript之间的区别是 ...

  10. Tiles框架简单介绍

    大家好,今天给大家分享一下,Tiles框架 一.Tiles框架作用简介 我们在写网页的时候,经常会遇见多个网页复用同样的代码,比如CSDN的菜单栏,顶部栏等,如果在每个页面中都复制粘贴,虽然说也可以实 ...

最新文章

  1. 最全pandas函数用法速查手册(高清版)
  2. HarmonyOS之基础环境和应用开发流程
  3. K-periodic Garland CodeForces - 1353E(贪心)
  4. Java修炼之路——基础篇——平台无关性
  5. 笔试常见的智力题(附答案)
  6. linux系统平均价格,简单认识Linux系统平均负载
  7. 实现一个靠左靠右靠中间的listview
  8. 计算机体系结构与组成的区别
  9. 电信机顶盒怎么连接鸿蒙系统电视,电信机顶盒的密码是多少,怎么改密码
  10. Flink Forward Asia Hackathon (2021) 回顾
  11. indesign怎么拼图_用R来拼图和排版,告别AI和PS(二):调节宽度和高度
  12. R语言ggplot2可视化多项式曲线、多项式方程以及多项式模型评估指标R方:使用ploynom包拟合三阶多项式模型
  13. 15微型计算机系统不包括,全国2002年10月自学考试计算机应用基础真题
  14. ROS加强精通过程--禁止 未授权用户上网
  15. 在windows11上安装cuda,cudnn,以及GPU版的pytorch
  16. 正方教务隐藏入口_正方教务系统小功能操作手册
  17. 文档服务器备份策略,服务器备份策略
  18. error C2065: “IDD_DIALOG1”: 未声明的标识符 .
  19. 华为P20 如时升Android 9.0,冬日如何保持好身材?升级EMUI9.0的华为P20系列有妙招...
  20. 计算机网络网络适配器的作用是什么原因,网络适配器的作用_网络适配器删了怎么办...

热门文章

  1. calwrf编译linux红帽,WRF模式运行手册
  2. source 命令与./命令
  3. Codeforces Round 250(Div. 2)
  4. simulink中的变压器参数解释及测量方法
  5. php openssl支持的加密算法和加密模式及加密解密示范实例
  6. 监理工程师岁月--甲乙丙方的斗智斗勇
  7. Pythonshellcode编码+混淆免杀
  8. FileUpload解析
  9. 29.【C语言】进制转换:10转16、10转2、2转10、16转10(Demo)
  10. java计算机毕业设计-游戏账号交易平台-演示录像-源码+数据库+系统+lw文档+mybatis+运行部署