序文
前回の記事で 、[08] Unity3DホットアップデートLuaFramework記事-原則及びより熱い設定ホットアップデートサーバ 、Iは熱アップデートの基本原則を導入し、サーバーを構築し始めます。
本物のホットアップデート機能を達成するための実践的な演習を行うことがBenpian。
まず、準備作業
図1に示すように、サーマルインターフェース更新を作成するため
私はホールインターフェイスを作った、と2つのボタンを配置していた:「リスト」と「モール」、チャートボタンはリーダーボードのページを開くために使用されてきました。
だから今、その後、ストアページを作るモールストアページを開いたときにボタンをクリックします。
1)生産ShopPanelインタフェース。
a)の店舗インタフェースShopPanel、タイトルを作成し、画面上の簡単な3つの商品アイテムを置きます。図は次のとおりです。
b)のプリフォームをShopPanelはショップ資産の下に\ LuaFramework \ CustomPrj \ディレクトリに配置されています。
C)ShopPalel.luaとShopCtrl.luaを作成し、CtrlNames PanelNames登録と登録を行います。ショップ資産下の\ LuaFramework \ Luaの\コントローラ\ディレクトリ上に表示する\ショップカタログ、ShopCtrl.lua資産残高\ LuaFramework \ Luaの\上ShopPanel.lua。
D)包装ShopPanelコードのHandleExampleBundle Packager.cs方法を添加します。
// 詰め、プリフォームShopPanelテストするための準備ができて AddBuildMap(" ショップ" + AppConst.ExtName、" * .prefab "、" 資産/ LuaFramework / CustomPrj /ショップ");
2)モール店パネルを表示するには、ボタンをクリックしてください
A)HallPanel.luaに格納ボタンへの参照を追加します。
HallPanel.luaローカル変換、 ローカルゲームオブジェクトを、 HallPanel = {}; ローカルこの = HallPanelと、 -開始イベント- 機能HallPanel.Awake(OBJ) ゲームオブジェクト = OBJ; 変換 = obj.transform; この.InitPanel(); logWarn(「アウェイクのLUAを>> --- " ..gameObject.name); エンド -パネルを初期化- 機能HallPanel.InitPanel() logWarn(" 私は私がロードされた、HallPanelよ。" ); - チャートボタン HallPanel.rankingBtn =変換:FindChildを("BtnRanking " ).gameObject; - ランキングパネル HallPanel.rankingPanel = transform.parent:検索(" RankingPanel " ); - ショップボタン HallPanel.shopBtn =変換:FindChild(" BtnShop 」).gameObjectを; - Ctrlキーを呼び出しますパネルの作成方法完成したときに HallCtrl.OnCreate(ゲームオブジェクト); エンド 機能HallPanel.OnDestroy() logWarn(" OnDestroy ---- >>>を" ); 終了b)はモールHallCtrl.luaイベント処理中にボタンを追加します。
HallCtrl.lua= HallCtrl {}; ローカルこの = HallCtrlと、 ローカル動作、 変換ローカル、 ローカルゲームオブジェクト; -構築機能- 機能HallCtrl.New() logWarn(" HallCtrl.New --- >> " ); 戻り これを、 エンド 機能HallCtrl.Awake() logWarn(" HallCtrl.Awake --- >> " ); logWarn(" 私は私がロードされた、HallCtrlよ。" ); エンド -発売記念イベント- 関数HallCtrl.OnCreate(OBJ) ゲームオブジェクト = OBJ; トランスフォーム =obj.transform; UIEventEx.AddButtonClick(HallPanel.rankingBtn、関数() ログ(" あなたは、チャートのボタンをクリックし、" ); HallPanel.rankingPanel.gameObject:のsetActive(真の); エンド); UIEventEx.AddButtonClick(HallPanel.shopBtn、機能() ログ(" あなたはショップ]ボタンをクリックして" ); - パネルショップインスタンス のローカルshopCtrl = CtrlManager.GetCtrl(CtrlNames.Shopを); shopCtrl:アウェイク(); エンド); 終了 -イベントをクリックします- 関数HallCtrl .OnClick(ゴー) を破壊(ゲームオブジェクト); エンド -オフイベント- 機能HallCtrl.Close() panelMgr:ClosePanel(CtrlNames.Hall)。 終わり3)包装と実行
a)の操作を実行するには、Windowsリソースを構築し、新たに追加されたShopPanelが自動的に採点されますバッグ
b)の実行Unityは、正しくお店パネルを開き、「モール」ボタンをクリックします。
図2に示すように、設定を変更するより多くの熱
オープンAppConst.csスクリプト、
trueに設定は、UpdateMode。
WebUrlアドレスhttp://192.168.0.110:8080/StreamingAssets/
192.168.110これは、マシンの私のIPで、Tomcatのデフォルトのポート番号を使用すると、実際の状況に応じて、独自のIPに変更することができます8080、です。
次に示すの位置を変更します:
図3に示すように、テストサーバーより多くの熱
1)Tomcatの下のwebappsディレクトリにコピーされた資産の全体の下StreamingAssetsディレクトリ、私はここにいます
I:\ apacheの-tomcatに-9.0.22のwebapps \。
2)お使いのブラウザに入力しますhttp://192.168.0.110:8080/StreamingAssets/files.txt 。
あなたがコンテンツfiles.txtに得ることができる場合、それはサーバーの準備ができてより多くの熱であることを示しています。
第二に、リソースのホットアップデート
1、クライアントプログラムを作ります
ホット更新操作は、両当事者、サーバー、クライアントを必要とします。また、サーバは今、クライアントプログラムの欠如準備ができている、と。
1)まず、Androidプラットフォームに統一プロジェクトを変換し、クリックAndroidのリソースのビルドメニューの再生成パッケージリソースを。
ビルドが完了した後2)、アイテムは現在、(最初のシーンをロードするために、シーン内のそのホールの位置0に注意)APKパケットをラベル付けされます
(打包的时候如果出现报错说插件冲突和架构重复啥的,删掉Plugins目录下的x86目录就好,保留x86_64目录)
3)把StreamingAssets目录复制到Tomcat的webapps目录(之前的删掉就行)。之前测试服务器的时候拷过去的是Windows版本资源,无法和安卓客户端进行更新,所以这里需要重新拷贝。
4)安装这个apk包到手机,手机应该和电脑位于同一局域网。我这里使用的是一个安装在本机上的安卓模拟器。
5)运行刚安装的程序。
能正常打开大厅场景,点击商城按钮,也能正常弹出商店界面。如下图:
如果刚进游戏如果直接点击不起作用,等一下再试(正在解压资源)。
现在客户端也已经就绪。
2、制作更新内容并上传到热更服务器;
上一步的操作中,我们打了一个安卓包,并将此时的StreamingAssets目录复制了到了Tomcat中,现在的状态是:
服务器上的StreamingAssets内容和安卓客户的StreamingAssets内容是相同的。这种状态下客户端是不会进行更新操作的。
假使安卓包已经上线,过了几天,我们需要更新版本。
更新内容就是:调整商店页面的商品,将商品1进行更新。
现在制作一个新的商店页面。
1)修改ShopPanel的预制体,将原商品1的名称修改为“新品“,图标也进行调整,如下图:
2)执行Build Android Resource菜单,重新进行打包;
3)打包完成后,将StreamingAssets目录复制到Tomcat的webapps目录下,覆盖掉之前的内容。
3、重新运行客户端
经过上一步的操作,现在的服务器资源是更新后的显示为“新品”的资源,而客户而还是之前的显示为“商品1”的资源。如下图:
在商店资源更新到服务器后,不用重新打安卓包。
直接重新运行之前的安卓客户端 ,如果客户端打开商店显示了“新口”的商品,则说明资源热更新成功了(预制体是一种Unity资源)。
好了,重新运行客户端。
点击商城按钮。能看到,商店界面已经自动更新到服务器的版本了。
效果与预期的一致,资源热更成功。
三、代码热更新
这里说的代码热更,只包含lua代码,所有的c#代码是没法更新的。
所以c#代码一般用来写一此底层逻辑,以及通用型逻辑,具体的业务逻辑最好都由lua来实现。
在版本计划中,如果不得不改动c#代码,那就只能发个全量包了。
现在开始做代码热更。
计划:修改ShopPanel.lua的代码,在代码中动态修改商店界面的标题,如果能看到商店标题被更改,则表示代码热更成功。
1、 修改ShopPanel.lua的代码,在代码中引用标题所在的Text组件,并将商店标题修改为“热更商店”。具体修改见下图:
2、 点击Build Android Resource,重新生成打包资源;
3、 将StreamingAssets目录复制到Tomcat的webapps目录,覆盖掉之前的;
4、 重新运行客户端程序。
能看到商店的标题已经被修改了。
说明代码更新成功。
至此,热更操作实战演练完成。
一些说明:
- 本文选用安卓包做客户端,一是为了验证这个热更功能在移动端上的可用性;二是因为,这个资源热更功能在Windows平台无法正常加载更新的资源。可能是框架原因,也可能是我的疏漏,没有查证。 不过好在安卓平台上的热更是没有问题的。至于iOS平台,条件有限,没法去测试。
- 热更版本的包在第一次启动的时候,有一个漫长的解压缩过程,上一篇讲原理的时候,有提到过。直接表现就是第一次运行,会黑屏很久。我这里没有黑屏,是因为我的大厅面板是直接显示的,不用等待解压过程。 但是,一看到大厅界面,就立即点击排行榜按钮和商城按钮,是不会在响应的,因为资源未解压完成,lua脚本啥的还未加载。 我给工程加了一个Unity-Logs-Viewer插件,在屏幕上划2圈,能打开日志界面,从日志里能看到解压缩的过程。
- 关于更新,目前框架实现的逻辑也比较简单,直接比较files.txt的内容,发现不一致就进行更新。 如果是实际项目的话,要做版本控制:Tomcat的webapps目录下应该是按版本放置的资源,并提供服务端版本号,客户端要有取服务端版本信息的能力,并根据版本号,从不同的目录读取资源。
- 关于下载,目前的下载逻辑也比较简易,是按资源一定能下载成功做的逻辑,没有处理资源下载失败等异常情况,最好在UI上也能对此过程有显示,这个需要自己完善。
- 总的来说,这是一个可用的框架,但是还需要自己完善。
项目地址
为方便参照学习,本项目源码已经上传到github,地址: