Unity中内嵌网页插件 UniWebView 2.8使用
2016.10.22 ? 孫廣東 ?
http://blog.csdn.net/u010019717
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? UniWebView2:適用于Andriod、ios和Mac os,在移動(dòng)端效果最好。支持WP8,不支持windows桌面系統(tǒng),包括編輯器狀態(tài)。? Unity4.x版本是 UniWebView
Unity AssetStore 上的插件: https://www.assetstore.unity3d.com/en/#!/content/32461? ? ? ??
? ? ? ? ? ? ?在Unity中主要用于活動(dòng),就想《陰陽(yáng)師》 ?手游!
?
開(kāi)發(fā)有些不方便,因?yàn)椴恢С?/span>window下的 Editor的調(diào)試!,? 只能在Mac下!
?
使用的主要思路
???? 插件的 官網(wǎng) ;?? http://uniwebview.onevcat.com/
下載插件然后安裝導(dǎo)入 Unity
?
使用 Prefab 和設(shè)置 URL .
??????? 從 UniWebView/Prefab 文件夾下 拖拽 UniWebViewObject ?預(yù)制體,在Inspector 上設(shè)置 URL(在Windows上也設(shè)置不了), Mac 上Play就可以看到效果, 但是在Window上要打包成移動(dòng)包才行。
?????????
?
UniWebView的工作方式
?
????????? 在Mac 系統(tǒng)下可以設(shè)置 UniWebView組件上的:? Insets 能控制 web 視圖的大小。Start函數(shù)中加載(Load On Start )和加載完成時(shí)自動(dòng)顯示(Auto Show WhenLoad Complete )。
?
?
?????????? 除了顯示 web 頁(yè)面的基本用法,UniWebView 有一些其他重要的功能、 與Unity場(chǎng)景通信, 偵聽(tīng) web 頁(yè)event事件和計(jì)算一些 javascript。
???????? 請(qǐng)參閱詳細(xì)的在線手冊(cè) http://uniwebview.onevcat.com/manual
???????? 和腳本引用 http://uniwebview.onevcat.com/reference/class_uni_web_view.html 。
?
?
通過(guò)腳本設(shè)置? UniWebView? 加載Web 內(nèi)容并顯示:
?????? 假設(shè), 你在 UniWebView.cs? 腳本的所在對(duì)象上有一個(gè)腳本,??其中定義了字段:
private UniWebView _webView;??? 你可以通過(guò)這樣的方式 得到 引用:
var _webView = gameObject.GetComponent<UniWebView>();?????? // 監(jiān)聽(tīng)事件
_webView.OnLoadComplete += OnLoadComplete; _webView.OnReceivedMessage += OnReceivedMessage; _webView.OnEvalJavaScriptFinished +=OnEvalJavaScriptFinished;??????????? 然后? 設(shè)置 Web 頁(yè)面的大小? 和你 想要加載頁(yè)面的Url :
?
_webView.insets = newUniWebViewEdgeInsets(5,5,5,5); // 距離全屏差5個(gè)像素 _webView.url = "http://uniwebview.onevcat.com/demo/index.html";?
???????????? 設(shè)置完成后,收到調(diào)用加載 頁(yè)面 :
_webView.Load();?
?????????? 頁(yè)面加載成功或者失敗的??完成回調(diào)函數(shù)大致如下:
voidOnLoadComplete(UniWebView webView, bool success, string errorMessage) {if (success) {// 顯示 加載完成的界面webView.Show();} else {// 輸出 錯(cuò)誤碼Debug.LogError("Something wrong in webview loading: " + errorMessage);} }?
如果 不想監(jiān)聽(tīng)(其實(shí)是不處理失敗檢測(cè))和自己處理這個(gè) OnLoadComplete ?事件,可以 設(shè)置屬性:??????? 你好像也可以 先調(diào)用 Show() ?函數(shù),然后在調(diào)用 Load(), 函數(shù)。
autoShowWhenLoadComplete = true;Web頁(yè)面和? Unity游戲邏輯的通信
一、UniWebView發(fā)送消息給 Unity
????????? 這個(gè)建議使用?url? 方案。UniWebView 將監(jiān)聽(tīng) 以? uniwebview:// 開(kāi)始 的 url
如果玩家在 Web 頁(yè)面點(diǎn)擊了 Url 鏈接, UniWebView 將會(huì)解析為一個(gè) UniWebViewMessage ?對(duì)象? ,然后引發(fā) OnReceivedMessage 事件。?? 一個(gè) UniWebViewMessage 對(duì)象包含 一個(gè)路徑字符串(其中有url 和args 參數(shù)字典)。
?????????? 例如當(dāng)點(diǎn)擊了鏈接 :? uniwebview://move?direction=up&distance=1
? 將被解析為:
path = "move" args = {direction ="up",distance ="1" }?
你在 監(jiān)聽(tīng)了 OnReceivedMessage 事件 的回調(diào)中, 會(huì)得到 UniWebViewMessage對(duì)象,然后實(shí)現(xiàn)自己的邏輯:????????? (自己注:? 在游戲中我們通常點(diǎn)擊了活動(dòng)的每個(gè)標(biāo)簽或者 Button,可能是頁(yè)面切換,可能是Button的網(wǎng)絡(luò)請(qǐng)求,? 都可以以這種方式來(lái)弄!? 如果是C#寫(xiě)邏輯,那不就沒(méi)有了一些熱更新的優(yōu)勢(shì)了???)
voidOnReceivedMessage(UniWebView webView, UniWebViewMessage message) {Debug.Log(message.rawMessage);if (string.Equals(message.path,"move")) {// It is time to move!// In this example:// message.args["direction"] ="up"// message.args["distance"] ="1"} }?
關(guān)于更多的? url 方法可以看:? AddUrlScheme 這個(gè)API 函數(shù)
http://uniwebview.onevcat.com/reference/class_uni_web_view.html#a785e560917f32efe65d91874c632f7d5
?
?
二、Unity發(fā)送消息到 UniWebView
?????? 你可以運(yùn)行任何的 javescript 頁(yè)面,??通過(guò)使用 EvaluatingJavaScript 你能調(diào)用并運(yùn)行Javascript,? 這個(gè)JavaScript代碼可以是你游戲腳本中的字符串形式。? 你能監(jiān)聽(tīng) OnEvalJavaScriptFinished ?事件, 來(lái)處理這個(gè)結(jié)果。
?
?
其他功能:
http://uniwebview.onevcat.com/manual
?
X??????背景透明-在 iOS 中,默認(rèn)情況下web 視圖還有一個(gè)灰色的背景 。你可以使用 SetTransparentBackground 來(lái)設(shè)置為 背景透明。
?
X??????加載進(jìn)度框 -? 就是表示加載進(jìn)度,以改善體驗(yàn)。您可以禁用 和 通過(guò)SetShowSpinnerWhenLoading 和SetSpinnerLabelText 自定義標(biāo)簽文本。
?
X ? ? ?Back 按鍵 和導(dǎo)航工具欄按鈕支持-用戶(hù)可以使用后退按鈕在 web 頁(yè)面之間導(dǎo)航,Android 設(shè)備上像在本機(jī)瀏覽器中一樣。Ios 是一個(gè)帶有導(dǎo)航按鈕的默認(rèn)工具欄。
?
X ? ? ?向前 和 向后 ,瀏覽器的兩個(gè)行為,您可以在你的游戲中控制網(wǎng)頁(yè)導(dǎo)航,通過(guò) GoBack 和GoForward 方法。
?
X ? ? ? ? 清理緩存-web 視圖將保持 url 請(qǐng)求,默認(rèn)情況下,這可能會(huì)使舊的頁(yè)面顯示。
即使您更新您的 web 頁(yè)。使用 CleanCache 來(lái)解決這一問(wèn)題。
?
X ? ? ? 在web 視圖? 播放 youtube 視頻 -只需加載url,它就如此簡(jiǎn)單的播放。
?
X ? ? ? 加載本地文件?和 html 字符串-? 給定設(shè)置 本地文件的 url,或 調(diào)用 LoadHTMLString 具有 html字符串的值,您可以加載本地的內(nèi)容。
?
X ? ? ? ?更多使用- 你不能只用它來(lái)加載 html 和web 頁(yè),而且還顯示一些圖像。
?
X 不止一個(gè) web 視圖-? 如果您希望在你的游戲中顯示 多個(gè) web 視圖,那就是 有多個(gè) 掛有UniWebView 組件的GameObject 而已。。
?
?
?
設(shè)置? AndroidManifest.xml???
??????????????? 因?yàn)?Unity垮平臺(tái), 肯定會(huì)使用第三方或者自己擴(kuò)展的android 插件, 就需要維護(hù)同一個(gè) AndroidManifest.xml? 文件,? 需要合并每個(gè)插件的需求 (解決沖突)。
????????
http://uniwebview.onevcat.com/manual.html#merge_instruction
?
?
????????????? 在導(dǎo)入這個(gè)插件之前, 如果在您的項(xiàng)目中已經(jīng)有一個(gè)AndroidManifest.xml 文件,你不應(yīng)該從 UniWebView 包導(dǎo)入 AndroidManifest.xml 文件了(如果沒(méi)有就直接全部導(dǎo)入就行了)。? 而是您需要手動(dòng)更新該文件。?? 其實(shí)是相當(dāng)簡(jiǎn)單,只需不到2 分鐘 。
?
???????????? 你可以遵循這些步驟,使其正常工作︰
1. ???在項(xiàng)目中的?Assets/Plugins/Android?? 路徑下 ,使用文本編輯器打開(kāi)? AndroidManifest.xml? 文件。
?
2. ? ? ? 文件中 搜索??android.intent.action.MAIN(肯定有且只有一個(gè))???????然后按照下面的步驟操作:
?
Merge(合并)
(1)?? 上面步驟二的搜索結(jié)果位于<activity>與</activity> 標(biāo)記對(duì)之間。? 然后插入下面兩行數(shù)據(jù):
<meta-dataandroid:name="android.app.lib_name" android:value="unity"/> <meta-dataandroid:name="unityplayer.ForwardNativeEventsToDalvik"android:value="true" />?聲明:?這個(gè)插件本人并沒(méi)有在實(shí)際項(xiàng)目中使用,??所有觀點(diǎn)都是個(gè)人理解,???給大家?guī)?lái)不便表示抱歉!
(2)? 同樣的在<activity...> 標(biāo)記中,將 android: name 的值更改為"com.onevcat.uniwebview.AndroidPlugin"。這將使用 UniWebView 的activity 來(lái)啟動(dòng)你的游戲。這樣做,這樣我們可以避免 web 視圖在 安卓系統(tǒng)的一些問(wèn)題(類(lèi)似的問(wèn)題網(wǎng)上也是有人 提到過(guò):
? ? ? ? ? ? ??“在安卓平臺(tái)使用最大的問(wèn)題是Unity失去焦點(diǎn)的問(wèn)題。經(jīng)過(guò)使用OnApplicationFocus方法測(cè)試,調(diào)用平臺(tái)WebView打開(kāi)界面時(shí)默認(rèn)打開(kāi)另一個(gè)Activity,Unity本身為一個(gè)Activity,當(dāng)打開(kāi)另外一個(gè)Activity時(shí)Unity會(huì)失去焦點(diǎn),此時(shí)焦點(diǎn)不在Unity程序身上,如果鎖屏或者按Home鍵再打開(kāi)后只會(huì)調(diào)出最后一個(gè)顯示的Activity,也就是UniWebView打開(kāi)的網(wǎng)頁(yè),而不是Unity程序。也就是在打開(kāi)網(wǎng)頁(yè)的界面按下Home鍵或者鎖屏后程序?qū)o(wú)法正常返回。主要的問(wèn)題在于Unity程序和打開(kāi)的網(wǎng)頁(yè)屬于不同的Activity,解決的方法為更改Unity工程中的安卓配置文件,使一個(gè)Activity繼承于另一個(gè),顯示在同一個(gè)Activity上。”)。 ? ? ? ? ? ? ? ? ? ?如果你的mainactivity ?使用的不是 com.unity3d.player.UnityPlayerNativeActivity、 com.unity3d.player.UnityPlayerActivity或com.unity3d.player.UnityPlayerProxyActivity 其中之一的話(huà),您必須修改UniWebView源代碼 修改到你的activity名字上。? 請(qǐng)參閱重新編譯的指南 http://uniwebview.onevcat.com/manual#manual-recompile ,更多地了解它。
(3) 同樣的在 <activity...> 標(biāo)記中,添加 android: hardwareAccelerated ="true"和android:windowSoftInputMode="adjustResize" 。這將使安卓系統(tǒng)提供 html5功能。
最總?? 會(huì)變成這樣的格式:
?
(4) 最后,添加訪問(wèn)互聯(lián)網(wǎng)的權(quán)限, 如果有了就不用添加了。 在</manifest> 標(biāo)記? 之前 添加:
?
<uses-permissionandroid:name="android.permission.INTERNET" />?http://blog.csdn.net/u010019717
?
插件Demo的一些 在安卓手機(jī)上的截圖:
?
總結(jié)
以上是生活随笔為你收集整理的Unity中内嵌网页插件 UniWebView 2.8使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 前端-给定一个字符串str,如何实现每个
- 下一篇: 若川知乎问答:2年前端经验,做的项目没什