一、新建场景

    在任意物体上添加Main组件。其实Main组件里面只是调用了,这是框架的起点。框架将会自动完成资源加载、热更新等等事项。

    二、删掉事例的调用

    现在不需要框架自带的示例了,需要删掉一些代码,使框架只运行我们编写的lua文件。打开Assets\LuaFramework\Scripts\Manager\GameManager.cs,将OnInitalize修改成下图这个样子。这是lua的入口,框架会调用Main.luaMain方法。

    三、编写lua代码

    打开Assets\LuaFramework\Lua\main.lua,编写lua代码。这里只添加一句“LuaFramework.Util.Log("HelloWorld");”(如下所示),它的功能相当于Debug.Log("HelloWorld")。

    1. --主入口函数。从这里开始lua逻辑
    2. function Main()
    3. LuaFramework.Util.Log("HelloWorld");
    4. end

    “LuaFramework.Util.Log("HelloWorld")”中的Util是c#里定义的类,供lua中调用。可以打开Assets\LuaFramework\Editor\CustomSettings.cs看到所有可以供lua调用的类,如下图是CustomSettings.cs的部分语句。

    1. //for LuaFramework
    2. _GT(typeof(RectTransform)),
    3. _GT(typeof(Text)),
    4. _GT(typeof(Util)),
    5. _GT(typeof(AppConst)),
    6. _GT(typeof(LuaHelper)),
    7. _GT(typeof(ByteBuffer)),
    8. _GT(typeof(LuaBehaviour)),
    9. _GT(typeof(GameManager)),
    10. _GT(typeof(LuaManager)),
    11. _GT(typeof(PanelManager)),
    12. _GT(typeof(SoundManager)),
    13. _GT(typeof(TimerManager)),
    14. _GT(typeof(ThreadManager)),
    15. _GT(typeof(NetworkManager)),
    16. _GT(typeof(ResourceManager)),

    再由具体的类可以查找所有的API(参见下面两个图),如下图是Util类的部分语句。

    1. public static void Log(string str) {
    2. Debug.Log(str);
    3. }
    4. public static void LogWarning(string str) {
    5. Debug.LogWarning(str);
    6. }
    7. public static void LogError(string str) {
    8. Debug.LogError(str);

    四、运行游戏

    按照默认的设置,每更改一次lua代码,都需要执行Build XXX Resource才能生效。读者可以将Assets\LuaFramework\Scripts\ConstDefine\AppConst.cs中的LuaBundleMode修改为false,这样代码文件便不会以AssetBundle模式读取,会直接生效,以方便调试。

    五、热更新原理

    接下来便要尝试代码热更新,让程序下载服务器上的lua文件,然后运行它。在说明热更新之前,需要先看看Unity3D热更新的一般方法。如下图所示,Unity3D的热更新会涉及3个目录。

    游戏资源目录:里面包含Unity3D工程中StreamingAssets文件夹下的文件。安装游戏之后,这些文件将会被一字不差地复制到目标机器上的特定文件夹里,不同平台的文件夹不同,如下所示(上图以windows平台为例)

    1. Mac OSWindowsApplication.dataPath + "/StreamingAssets";
    2. IOS Application.dataPath + "/Raw";
    3. Androidjar:file://" + Application.dataPath + "!/assets/";

    数据目录:由于“游戏资源目录”在Android和IOS上是只读的,不能把网上的下载的资源放到里面,所以需要建立一个“数据目录”,该目录可读可写。第一次开启游戏后,程序将“游戏资源目录”的内容复制到“数据目录中”(步骤1,这个步骤只会执行一次,下次再打开游戏就不复制了)。游戏过程中的资源加载,都是从“数据目录”中获取、解包(步骤3)。不同平台下,“数据目录”的地址也不同,LuaFramework的定义如下:

    1. AndroidIOSApplication.persistentDataPath + "/LuaFramework"
    2. Mac OSWindowsc:/LuaFramework/
    3. 调试模式下:Application.dataPath + "/StreamingAssets/"

    网络资源地址:存放游戏资源的网址,游戏开启后,程序会从网络资源地址下载一些更新的文件到数据目录。

    1. StreamingAssets|1738a512698f18f78bfca1591edcf5ae
    2. StreamingAssets.manifest|1994f53ee73e2badeddd65601d587f38
    3. message.unity3d|1ab91c2ccd6a03232c0255c1895c6435
    4. message.unity3d.manifest|9f46935cf1de80e8fab9927c6a25803f
    5. prompt.unity3d|01b68a164fa653bf853bedbda3a5f3d0
    6. prompt.unity3d.manifest|9ebfa552ca1e8a84360944c0dee65bb3
    7. prompt_asset.unity3d|1655812ce2260a4747a7fdb8e39fc007
    8. prompt_asset.unity3d.manifest|ed9d66a485b1d96d504f7002c52ef9a4
    9. shared_asset.unity3d|17ce04b42949f651895d634f852dd972
    10. shared_asset.unity3d.manifest|71721e8dbf69055affcf2a2e0b551f01
    11. tank.unity3d|a5f10487d490d13642d40fce937c195c
    12. tank.unity3d.manifest|202261f1e418ab2bbb8384ed6f54f958
    13. lua/Build.bat|4cfc2f258ecdb9bb43756a2e737c7a1d

    LuaFramework的热更新代码定义在Assets\LuaFramework\Scripts\Manager\GameManager.cs,真正用到项目时可能还需少许改动。

    六、开始热更新代码

    那么开始测试热更新代码的功能吧!热更上述实现的“HelloWorld”。

    1)、修改配置

    框架的默认配置是从本地加载文件,需要打开AppConst.cs将UpdateMode设置为true(才会执行步骤2),将LuaBundleMode设置为true,将WebUrl设置成服务器地址。

    2)、配置“网络资源”

    创建ASP.NET项目 MyHotUpdateWebTest
    添加index.html
    1. // index.html
    2. <!DOCTYPE html>
    3. <html xmlns="http://www.w3.org/1999/xhtml">
    4. <head>
    5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    6. <title></title>
    7. <meta charset="utf-8" />
    8. </head>
    9. <body>
    10. Hello MyFrameWork!
    11. </body>
    12. </html>
    添加一般处理程序
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Web;
    5. using System.Web.Script.Serialization;
    6. namespace MyHotUpdateWebTest
    7. {
    8. /// <summary>
    9. public class Login : IHttpHandler
    10. {
    11. public void ProcessRequest(HttpContext context)
    12. {
    13. context.Response.ContentType = "text/plain";
    14. //context.Response.Write("Hello World");
    15. Dictionary<string, object> dic = new Dictionary<string, object>();
    16. dic["result"] = "success";
    17. JavaScriptSerializer jss = new JavaScriptSerializer();
    18. string result = jss.Serialize(dic);
    19. context.Response.Write(result);
    20. context.Response.End();
    21. }
    22. public bool IsReusable
    23. {
    24. get
    25. {
    26. return false;
    27. }
    28. }
    29. }
    30. }
    配置Web.config
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <!--
    3. 有关如何配置 ASP.NET 应用程序的详细信息,请访问
    4. http://go.microsoft.com/fwlink/?LinkId=169433
    5. -->
    6. <configuration>
    7. <system.web>
    8. <compilation debug="true" targetFramework="4.5" />
    9. <httpRuntime targetFramework="4.5" />
    10. </system.web>
    11. <system.webServer>
    12. <staticContent>
    13. <mimeMap fileExtension=".list" mimeType="application/octet-stream" />
    14. <mimeMap fileExtension=".ab" mimeType="application/octet-stream" />
    15. </staticContent>
    16. <directoryBrowse enabled ="true" />

    3)、测试热更新

    ?