uLua 学习笔记 之一 lua脚本 打包与读取
最近要学习热更新,搜了下,选择了ulua这个插件,本人也是新人。对这个插件也是一知半解,不过幸好加了专门讨论这一块的群,这个群的技术氛围还是很浓重的,特别是已经形成了一套自己的lua学习框架。最近周末就抽空研究了一下。
群号这里分享一下给大家 Unity3D&uLua技术交流群 341746602
开始这篇我希望你对热更新有一定了解,并且对ulua有初步的尝试。
一、打包
lua的后缀是不被支持打包进assertbundle的,所以我们一般把 .lua后缀 变为.lua.txt 或者 .lua.bytes 进行打包。
这里我就直接使用了框架的代码
[MenuItem("Lua/Build Lua without jit", false, )]
public static void BuildLuaNoJit()
{
BuildAssetBundleOptions options = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets | BuildAssetBundleOptions.DeterministicAssetBundle;
/// 清零掉这个 目录下的 * .bytes 文件 方便重新生成
string[] files = Directory.GetFiles("Assets/Lua/Out", "*.lua.bytes");
for (int i = ; i < files.Length; i++)
{
FileUtil.DeleteFileOrDirectory(files[i]);
}
/// convert files whth *.lua format to .bytes format
/// then move to Application.dataPath + "/Lua/Out/"
files = Directory.GetFiles(Application.dataPath + "/Lua/", "*.lua", SearchOption.TopDirectoryOnly);
for (int i = ; i < files.Length; i++)
{
string fname = Path.GetFileName(files[i]);
FileUtil.CopyFileOrDirectory(files[i], Application.dataPath + "/Lua/Out/" + fname + ".bytes");
}
AssetDatabase.Refresh();
//use list to collect files whith *.bytes format
files = Directory.GetFiles("Assets/Lua/Out", "*.lua.bytes");
List<Object> list = new List<Object>();
for (int i = ; i < files.Length; i++)
{
Object obj = AssetDatabase.LoadMainAssetAtPath(files[i]);
list.Add(obj);
}
///buildpipeline with list
if (files.Length > )
{
string output = string.Format("{0}/Bundle/Lua.unity3d", Application.dataPath);
BuildPipeline.BuildAssetBundle(null, list.ToArray(), output, options, EditorUserBuildSettings.activeBuildTarget);
string output1 = string.Format("{0}/{1}/Lua.unity3d", Application.persistentDataPath, GetOS());
FileUtil.DeleteFileOrDirectory(output1);
Directory.CreateDirectory(Path.GetDirectoryName(output1));
FileUtil.CopyFileOrDirectory(output, output1);
AssetDatabase.Refresh();
}
UnityEngine.Debug.Log("编译lua文件结束");
}
在框架里我新加了一个myTest.lua 文件
--region NewFile_1.lua
--Author : admin
--Date : //
--此文件由[BabeLua]插件自动生成 print("This is a script from a file") --endregion
然后运用脚本进行批处理,可以看到我已经打完完毕进 Lua 的 *.unity3d 包里了。

二、读取
一般包内的初始资源从streamAssert中 加载 到 persistpath ,然后之后就从服务器更新 等等之类,超出本文的范围。
我这里就演示下 使用 www 从streamAsserts 路径读取 这个 assetbundle。
至于什么要从www,这个适用于全平台
#if UNITY_EDITOR
string dbpath = "file://" + Application.streamingAssetsPath + "/" + dbfilename
//or string path = "file://" + Application.dataPath + "/StreamingAssets" + "/" + "dbfilename";
#elif UNITY_IPHONE
string dbpath = "file://" + Application.streamingAssetsPath + "/" + "dbfilename";
//or string path = "file://" + Application.dataPath + "/Raw" + "/" + dbfilename";
#elif UNITY_ANDROID
string dbpath = Application.streamingAssetsPath + "/" + dbfilename;
//or string path = "jar:file://" + Application.dataPath + "!/assets/" + "/dbfilename";
#endif
using UnityEngine;
using System.Collections;
using LuaInterface; public class Test : MonoBehaviour
{
void OnGUI()
{
if (GUI.Button(new Rect(, , , ), "TestRead")) StartCoroutine(TestRead()); if (GUI.Button(new Rect(, , , ), "TestRead2")) TestRead2();
} IEnumerator TestRead()
{
Debug.Log("TestRead"); string path = "file://" + Application.streamingAssetsPath + "/Lua.unity3d"; WWW www = new WWW(path); yield return www; Debug.Log("load finish"); AssetBundle bundle = www.assetBundle; TextAsset text = bundle.Load("myTest.lua") as TextAsset; if(text != null){
LuaState lu = new LuaState();
lu.DoString(text.text);
}
else{
Debug.LogError("text == null");
}
} public TextAsset tmp; //reference myTest.lua void TestRead2()
{
Debug.Log("TestRead2"); LuaState lu = new LuaState(); lu.DoString(tmp.text);
}
}
如下结果,我们成功实现了从assertbundle读取脚本

问题:
这里不知道为什么,你点击TestRead 之后 再点一次会报个错误。
The asset bundle 'file://C:/Users/admin/Desktop/HotUpdate/CsToLua-master/CsToLua-master/tolua/Assets/StreamingAssets/Lua.unity3d' can't be loaded because another asset bundle with the same files are already loaded
原因如下:http://docs.unity3d.com/Manual/keepingtrackofloadedassetbundles.html

uLua 学习笔记 之一 lua脚本 打包与读取的更多相关文章
- 微信小程序开发:学习笔记[5]——JavaScript脚本
微信小程序开发:学习笔记[5]——JavaScript脚本 快速开始 介绍 小程序的主要开发语言是 JavaScript ,开发者使用 JavaScript 来开发业务逻辑以及调用小程序的 API 来 ...
- uLua学习笔记(三):Unity3D和Lua之间的相互调用
这篇笔记主要集中学习一下uLua和Unity3D之间相互调用的方法,我们导入了uLua之后,现在会弹出一个类似学习屏幕的东西,如下: 先赞一个! Unity3D调用Lua Unity3D调用Lua的方 ...
- ulua学习笔记(二):官方资料及问题解决方案
uLua&SimpleFramework入门视频教程网盘地址 视频教程地址 http://pan.baidu.com/s/1gd8fG4N游戏框架地址 https://github.com/j ...
- uLua学习之调用Lua函数(五)
前言 在我开始这个系列的第一篇文章中,我就提到了Lua脚本用来实现宿主脚本的配置性和扩展性.上节说到的调用外部Lua脚本就对应了它的两大特性之一的配置性,那么另一大特性如何来体现呢?这就要说我们今天的 ...
- 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式
正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...
- matlab学习笔记4--MAT文件的保存和读取
一起来学matlab-matlab学习笔记4 数据导入和导出_1 MAT文件的保存和读取 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用&g ...
- (学习笔记3)BMP位图的读取与显示
在(学习笔记2)中.我们已经具体说明怎样去创建MFC.在这节中.主要解决BMP位图照片的读取和显示问题. 我们新建一个projectdemo1.创建步骤请看(学习笔记2)中具体说明. 创建成功后,例如 ...
- uLua学习笔记(一):uLua安装及上手
uLua下载:http://www.ulua.org/ VS2012/2013的用于编写Lua的插件:https://babelua.codeplex.com/或http://unknownworld ...
- Maven学习笔记(十二)-maven打包之resource配置
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u011781521/article/details/79052725 一.简介 构建Maven项目的 ...
随机推荐
- 解决IE6下固定定位问题 使用position:fixed
IE6浏览器有太多的bug让制作网页的人头疼.这篇文章介绍的是介绍的是如何解决IE6不支持position:fixed;属性的办法. 如果我们需要做某个元素始终位于浏览器的底部,不会因为浏览器窗口的缩 ...
- 完美解决移动Web小于12px文字居中的问题
前几天的一篇博文:移动Web单行文字垂直居中的问题,提到了移动web里小于12px的文字居中异常的问题,最后还是改为12px才近乎解决了问题.但是有时候或许并不是那么乐观,你并不能将原本定为10px的 ...
- web应用中webapp. root重用问题解决方案
同一个tomcat服务器里面部署两个JavaEE项目,都是用了log4j做日志.并且web.xml里面都监听了日志信息. 启动服务的时候报错. 于是在web.xml添加以下代码: <di ...
- oracle 备份与还原 及相关操作
drop user 用户名 cascade; ........删除用户 create user 用户名 identified by 密码 default tablespace 数据文件名 tempor ...
- 14种网页jQuery和css3特效插件代码演示
1.网页table增删样式代码 演示和下载地址 2.jQuery左右滑动幻灯片插件 演示和下载地址 3.jQuery文字轮播焦点图 演示和下载地址 4.网页文字焦点图切换 演示和下载地址 5.jQue ...
- php关联不上mysql解决办法
## php无法关联mysql php关联不上mysql解决办法: 尝试N多方法,需要的dll文件都复制了,依旧是不断提示: Fatal error: Call to undefined fun ...
- js学习笔记一-语法结构
js是区分大小写的,关键字.变量.函数名和所有的标识符都必须采取统一一致的大小写形式. js定义了unicode转义序列,以\u开头,其后跟随四个十六进制数,可以在字符串直接量.正则表达式直接量和标识 ...
- highchars
var drawChart = function(sourceUrl) { $.ajax({ "type" : "post", "url" ...
- 使用jQuery获取GridView的数据行的数量
一个同事在群里抛出了上述的问题,另一个同事给出了答案,试了一下,还不错.贴出代码和效果图: <html xmlns="http://www.w3.org/1999/xhtml" ...
- openerp经典收藏 OpenERP库存管理的若干概念讲解(新增库存价值)(转载)
OpenERP库存管理的若干概念讲解(新增库存价值) 原文:http://shine-it.net/index.php/topic,2425.0/topicseen.html 一.复式库存(Doubl ...