Unity3D热更新-LuaFramework-使用lua创建物体

发表于2018-09-04
评论0 3.6k浏览
热更新涉及资源热更新和代码热更新(其实lua代码也是资源),本篇文章中要给大家介绍的是如何使用lua创建物体,动态加载一个模型,然后热更成其他素材。

1、创建物体

为了调试的方便,笔者先将框架配置为本地模式,待测试热更新时再改成更新模式。
/// <summary>
        /// 如果开启更新模式,前提必须启动框架自带服务器端。
        /// 否则就需要自己将StreamingAssets里面的所有内容
        /// 复制到自己的Webserver上面,并修改下面的WebUrl。
        /// </summary>
        public const bool UpdateMode = false;                       //更新模式-默认关闭 
        public const bool LuaByteMode = false;                       //Lua字节码模式-默认关闭 
        public const bool LuaBundleMode = true;                    //Lua代码AssetBundle模式

先测试个简单的创建物体,新建一个名为go的物体,然后设置它的坐标为(1,1,1)。这段代码虽然不涉及资源加载,但能展示“把物体添加到场景中”的过程。Main.lua的代码如下:
function Main()                 
    local go = UnityEngine.GameObject ('go')
    go.transform.position = Vector3.one     
end

2、资源打包

LuaFramework在打包方面并没有做太多的工作,我们需要手动打包。打开Assets/LuaFramework/Editor/Packager.cs,按照示例的写法,加上下面这一行:将Assets/Tank目录下的所有预设(。prefab)打包成名为tank的包。
/// <summary>
    /// 处理框架实例包
    /// </summary>
    static void HandleExampleBundle() {
        string resPath = AppDataPath + "/" + AppConst.AssetDir + "/";
        if (!Directory.Exists(resPath)) Directory.CreateDirectory(resPath);
        AddBuildMap("prompt" + AppConst.ExtName, "*.prefab", "Assets/LuaFramework/Examples/Builds/Prompt");
        AddBuildMap("message" + AppConst.ExtName, "*.prefab", "Assets/LuaFramework/Examples/Builds/Message");
        AddBuildMap("prompt_asset" + AppConst.ExtName, "*.png", "Assets/LuaFramework/Examples/Textures/Prompt");
        AddBuildMap("shared_asset" + AppConst.ExtName, "*.png", "Assets/LuaFramework/Examples/Textures/Shared");
//Add
        AddBuildMap("cubetest" + AppConst.ExtName, "*.prefab", "Assets/MyTestPrefab/PrefabTest/CubeTest");
    }

新建文件夹:Assets/MyTestPrefab/PrefabTest/CubeTest
新建Cube。重命名:CubeTestOne。做成prefab。
点击“BuildWindowsResource”,即可在StreamingAssets中看到打包好的文件。
cubetest
cubetest.unity3d

3、动态加载模型

编写如下lua代码(main.lua),使用框架提供的资源管理器(resMgr)加载tank包的TankPrefab文件,加载完成后回调OnLoadFinish方法。在OnLoadFinish中使用Instantiate实例化对象。
--主入口函数。从这里开始lua逻辑
function Main()
     LuaHelper = LuaFramework.LuaHelper;
     resMgr = LuaHelper.GetResManager();
     resMgr:LoadPrefab('cubetest',{'CubeTestOne'},OnLoadFinish);    
end
function OnLoadFinish( objs )
    -- body
    local go = UnityEngine.GameObject.Instantiate(objs[0]);
    LuaFramework.Util.Log("Finish");
end
完成后运行游戏,即可看到动态加载出来的模型。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引