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