uluaFramework--框架简单介绍
2020-04-08 22:29
155 查看
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; //用户ID public 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脚本中的方法
相关文章推荐
- OpenUI5 (SAPUI5) js框架简单介绍
- iOS开发网络篇—简单介绍ASI框架的使用
- 云计算工具,框架,服务简单介绍
- Django框架模型简单介绍与使用分析
- 介绍jquery.validate.js简单实用的表单验证框架
- 内核之框架介绍及简单修改
- 响应式编程以及反应式编程框架Reactor3的简单介绍
- iOS开发网络篇—简单介绍ASI框架的使用
- iOS 第三方框架-SVProgressHUD的简单介绍
- Java集合框架的知识总结(1) 说明:先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析。 1、综述 所有集合类
- 权限控制框架Shiro简单介绍及配置实例
- Android Query框架用法简单介绍
- java 集合框架 简单介绍
- SSM框架简单介绍以及maven环境搭建
- xDom-一个简单的Delphi框架-介绍及下载
- 【COCOS2DX-LUA 脚本开发之六】利用Lua强转函数解决使用CCNode报错或无法正常使用以及简单介绍 quick-cocos2d-x 与 OpenQuick 两款Lua免费开源框架
- Dubbo分布式服务框架简单介绍+代码
- Caffe框架简单介绍(十二)
- Python开源抓取框架简单介绍,以及安装(ubuntu)常见问题解决
- H264 编解码框架简单介绍