uLua 学习笔记 之一 lua脚本 打包与读取

   最近要学习热更新,搜了下,选择了ulua这个插件,本人也是新人。对这个插件也是一知半解,不过幸好加了专门讨论这一块的群,这个群的技术氛围还是很浓重的,特别是已经形成了一套自己的lua学习框架。最近周末就抽空研究了一下。

  群号这里分享一下给大家 Unity3D&uLua技术交流群 341746602

开始这篇我希望你对热更新有一定了解,并且对ulua有初步的尝试。

一、打包

  lua的后缀是不被支持打包进assertbundle的,所以我们一般把 .lua后缀 变为.lua.txt 或者 .lua.bytes 进行打包。

这里我就直接使用了框架的代码

  

 1     [MenuItem("Lua/Build Lua without jit", false, 2)]
 2     public static void BuildLuaNoJit()
 3     {
 4         BuildAssetBundleOptions options = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets | BuildAssetBundleOptions.DeterministicAssetBundle;
 5
 6         string[] files = Directory.GetFiles("Assets/Lua/Out", "*.lua.bytes");
 7
 8         for (int i = 0; i < files.Length; i++)
 9         {
10             FileUtil.DeleteFileOrDirectory(files[i]);
11         }
12
13         files = Directory.GetFiles(Application.dataPath + "/Lua/", "*.lua", SearchOption.TopDirectoryOnly);
14
15         for (int i = 0; i < files.Length; i++)
16         {
17             string fname = Path.GetFileName(files[i]);
18             FileUtil.CopyFileOrDirectory(files[i], Application.dataPath + "/Lua/Out/" + fname + ".bytes");
19         }
20
21         AssetDatabase.Refresh();
22
23         files = Directory.GetFiles("Assets/Lua/Out", "*.lua.bytes");
24         List<Object> list = new List<Object>();
25
26         for (int i = 0; i < files.Length; i++)
27         {
28             Object obj = AssetDatabase.LoadMainAssetAtPath(files[i]);
29             list.Add(obj);
30         }
31
32         if (files.Length > 0)
33         {
34             string output = string.Format("{0}/Bundle/Lua.unity3d", Application.dataPath);
35             BuildPipeline.BuildAssetBundle(null, list.ToArray(), output, options, EditorUserBuildSettings.activeBuildTarget);
36             string output1 = string.Format("{0}/{1}/Lua.unity3d", Application.persistentDataPath, GetOS());
37             FileUtil.DeleteFileOrDirectory(output1);
38             Directory.CreateDirectory(Path.GetDirectoryName(output1));
39             FileUtil.CopyFileOrDirectory(output, output1);
40             AssetDatabase.Refresh();
41         }
42
43         UnityEngine.Debug.Log("编译lua文件结束");
44     }

在框架里我新加了一个myTest.lua 文件

--region NewFile_1.lua
--Author : admin
--Date   : 2015/1/18
--此文件由[BabeLua]插件自动生成

print("This is a script from a file")

--endregion

然后运用脚本进行批处理

  

二、读取

  一般包内的初始资源从streamAssert中 加载 到 persistpath ,然后之后就从服务器更新。我这里就图方便,直接用 www 从streamAsserts 路径读取了。

 1 using UnityEngine;
 2 using System.Collections;
 3 using LuaInterface;
 4
 5 public class Test : MonoBehaviour
 6 {
 7     void OnGUI()
 8     {
 9         if (GUI.Button(new Rect(10, 10, 150, 100), "TestRead"))   StartCoroutine(TestRead());
10
11         if (GUI.Button(new Rect(10, 200, 150, 100), "TestRead2")) TestRead2();
12     }
13
14
15     IEnumerator TestRead()
16     {
17         Debug.Log("TestRead");
18
19         string path = "file://" + Application.streamingAssetsPath + "/Lua.unity3d";
20
21         WWW www = new WWW(path);
22
23         yield return www;
24
25         Debug.Log("load finish");
26
27         AssetBundle bundle = www.assetBundle;
28
29         TextAsset text = bundle.Load("myTest.lua") as TextAsset;
30
31
32         if(text != null){
33             LuaState lu = new LuaState();
34             lu.DoString(text.text);
35         }
36         else{
37             Debug.LogError("text == null");
38         }
39     }
40
41
42     public TextAsset tmp; //reference  myTest.lua
43
44     void TestRead2()
45     {
46         Debug.Log("TestRead2");
47
48         LuaState lu = new LuaState();
49
50         lu.DoString(tmp.text);
51     }
52 }

如下结果,我们成功实现了从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  

时间: 2024-10-24 01:00:22

uLua 学习笔记 之一 lua脚本 打包与读取的相关文章

JAVA学习笔记 -- 把资源文件打包到jar包

初学GUI,用Eclipse导出jar包,设定的最小化图标不能显示(hello.png文件放在项目的根目录下).代码如下: import javax.swing.JFrame; import java.awt.Toolkit; import java.awt.Image; import java.net.URL; public class GUITest { public static void main(String[] args) { JFrame frame = new JFrame();

Swift学习笔记(15)--下标脚本(Subscripts)

下标脚本可以定义在类(Class).结构体(structure)和枚举(enumeration)这些目标中,使用中类似数组或者字典的用法 1.定义 定义下标脚本使用subscript关键字,语法: subscript(index: Int) -> Int { get { // 返回与入参匹配的Int类型的值 } set(newValue) { // 执行赋值操作 } } 注:newValue的类型必须和下标脚本定义的返回类型相同.与计算型属性相同的是set的入参声明newValue就算不写,在s

微信小程序开发:学习笔记[5]——JavaScript脚本

微信小程序开发:学习笔记[5]--JavaScript脚本 快速开始 介绍 小程序的主要开发语言是 JavaScript ,开发者使用 JavaScript 来开发业务逻辑以及调用小程序的 API 来完成业务需求. 在大部分开发者看来,ECMAScript和JavaScript表达的是同一种含义,但是严格的说,两者的意义是不同的.ECMAScript是一种由Ecma国际通过ECMA-262标准化的脚本程序设计语言, JavaScript 是 ECMAScript 的一种实现.理解 JavaScr

uLua学习笔记(三):Unity3D和Lua之间的相互调用

这篇笔记主要集中学习一下uLua和Unity3D之间相互调用的方法,我们导入了uLua之后,现在会弹出一个类似学习屏幕的东西,如下: 先赞一个! Unity3D调用Lua Unity3D调用Lua的方法还是比较简单的,所以先说这个,由于这部分在学习笔记(一)中已经说的挺多的了,更多的内容点击这里回去看,所以这里我们就来看一个简单的示例即可: 1 using LuaInterface; 2 using UnityEngine; 3 4 public class UnityCallLua : Mon

uLua学习之调用Lua函数(五)

前言 在我开始这个系列的第一篇文章中,我就提到了Lua脚本用来实现宿主脚本的配置性和扩展性.上节说到的调用外部Lua脚本就对应了它的两大特性之一的配置性,那么另一大特性如何来体现呢?这就要说我们今天的话题了:Lua函数.uLua插件是用来解决unity3d热更新的方案,在我们需要对宿主程序做一些局部逻辑上的修改时,Lua函数就变得至关重要.那么如何在uLua中来调用Lua函数呢,现在就来看看吧!我们将通过两个例子来了解如何调用Lua函数. 第一个例子 首先,这个例子的函数是非常简单的,所以我们就

cocos2d-x学习笔记(android自动化打包bat脚本)

1.先按照cocos2d-x的环境配置要求(ant等)安装好,然后在安卓目录下proj.android新建build.bat,脚本如下: @echo off echo 准备开始  echo 设置路径 set ROOT_PATH="F:\test" set PROJECT_PATH="%ROOT_PATH%\proj.android" set RESOURCES_PATH="%ROOT_PATH%\Resources" set COCOS2DX_P

[Unity热更新]ulua学习笔记01:一个小坑

看了一下以前写的文章,发现都好水啊..我也想写出能真正帮到别人的文章,但没办法啊,自己的脑子太笨了..希望可以通过不断学习,终有一天能写出点好文章! 最近在学习unity中的热更新,既然大神都说ulua效率最高(就现在来说),那就学习ulua吧!首先要下载的是ulua的包,现在的最新版本是1.08,而且根据官网上说的,网上流行的1.03/1.05含有大量的bug,所以我选择了最新的版本,谁知道就掉进了第一个坑! 因为是菜鸟,所以先复制一下网上的代码看看效果如何,结果碰到这样的错误: 搜索了这些错

python基础教程_学习笔记25:程序打包

程序打包 准备发布程序时,开发者在程序发布前可能会想到将其打包.如果只有一个.py文件,那将不是什么大问题,但如果面对的是非程序员用户,甚至在正确位置放置一个简单的python库文件,或者处理PYTHONPATH变量这类工作都超出了他们的能力范围的话,就不好办了.用户通常只想双击一个安装程序,跟着安装向导一步一步走,接着程序就可以运行了. distutils是每个程序员工具包内的基础工具,而且事实上distutils能做到比基于脚本的python库安装程序还要多:它可以用来建立简单的window

Quick cocos2dx-Lua(V3.3R1)学习笔记(十)-----搭建安卓打包环境,用官方示例anysdk生成apk运行

话说我这一篇就写搭建打包安卓环境,是不是有点过早了(其实我主要是怕以后重装系统,忘了怎么搭建了),但是迟早要面对的痛苦,一直延后也不是办法,对吧. 在官方文档中,对于打包安卓apk,已经很清楚了,我写这个这篇,只不过加点图片,介绍的更加详细. 搭建打包安卓环境,需要很多安装很多东东,我直接将我用的全部打包上传到网盘了,需要的朋友,去网盘下载就行了 整合包网盘下载地址:http://pan.baidu.com/s/1hquz7fe     密码:r2nq 一,搭建安卓环境 我在我G盘根目录下新建一