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

时间:2023-03-08 15:44:38

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

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

  

二、读取

  一般包内的初始资源从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读取脚本

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

问题:

  这里不知道为什么,你点击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脚本 打包与读取