码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-18 02:02:20      阅读:924      评论:0      收藏:0      [点我收藏+]

标签:

 

   最近要学习热更新,搜了下,选择了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  

 

技术分享

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

标签:

原文地址:http://www.cnblogs.com/chongxin/p/4231394.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!