目前有三種方式可以實現在Unity工程中實現內嵌網頁的功能:
1、 UnityWebCore:只支持Windows平台,調用瀏覽器內核,將網頁渲染到mesh,作為gameObject。
2、 Unity-Webview:只適用於Andriod和ios平台,調用移動平台的Webview。
3、 UniWebView:適用於Andriod、ios和Mac os,在移動端效果最好。2.0版本之后支持WP8,不支持windows桌面系統,包括編輯器狀態。
二、使用的主要思路
- <span style="font-size:18px;"> void OpenURL() //打開網址
- {
- _cachedView.TitleLabel.text = "資訊";
- _webView = _uiTrans.gameObject.GetComponent<UniWebView> ();
- if (_webView == null)
- {
- _webView=_uiTrans.gameObject.AddComponent<UniWebView>();
- //_webView.OnReceivedMessage += OnReceivedMessage;
- //_webView.OnLoadComplete += OnLoadComplete;
- //_webView.OnWebViewShouldClose += OnWebViewShouldClose;
- //_webView.OnEvalJavaScriptFinished += OnEvalJavaScriptFinished;
- _webView.InsetsForScreenOreitation += InsetsForScreenOreitation;
- }
- if(InformationManager.Instance.ArticleType == EArticleType.Notice)
- {
- _webView.url = AppManager.Instance.GameIP + "/gatj?ad=" + InformationManager.Instance.ArticleId;
- }
- else if(InformationManager.Instance.ArticleType == EArticleType.V)
- {
- _webView.url = AppManager.Instance.GameIP + "/detaifdav.jsp?articleId=" + InformationManager.Instance.VId;
- }
- _webView.Load(); //加載網頁
- ShowOrHide(true); //控制顯示
- }
- public void ShowOrHide(bool flag)
- {
- if(flag)
- {
- _webView.Show ();
- }
- else
- {
- _webView.Hide();
- }
- }
- void CloseWeb(UniWebView webView) //關閉網頁
- {
- webView.Hide();
- UnityEngine.Object.Destroy(webView);
- //webView.OnReceivedMessage -= OnReceivedMessage;
- //webView.OnLoadComplete -= OnLoadComplete;
- //webView.OnWebViewShouldClose -= OnWebViewShouldClose;
- //webView.OnEvalJavaScriptFinished -= OnEvalJavaScriptFinished;
- webView.InsetsForScreenOreitation -= InsetsForScreenOreitation;
- _webView = null;
- }</span>
代碼來自實際項目,只提供主要思路。
調用安卓和ios自身平台的方法封裝在jar和mm文件中,提供了UniWebView類調用這些方法。打開網頁時將UniWebView作為組件掛在一個gameObject上。將網址字符串賦值給UniWebView中的url字段,調用Load()方法加載網址,Show()方法顯示在屏幕上,對應Hide()方法。關閉時,先隱藏,再銷毀UniWebView組件。
UniWebView類中提供了一些回調方法,本項目中用到了UniWebViewEdgeInsets。默認打開網頁是全屏方式,UniWebViewEdgeInsets是使網頁偏移。也就是控制網頁顯示的區域和位置。需要注意,在安卓平台插入的值以像素為單位,在ios平台,因為不同機型屏幕scale值不同,同一個值插入效果不一樣,建議判斷機型根據效果將數值寫死:
- <span style="font-size:18px;"> UniWebViewEdgeInsets InsetsForScreenOreitation(UniWebView webView, UniWebViewOrientation orientation)
- {
- #if UNITY_IOS
- var iphoneGen=UnityEngine.iOS.Device.generation;
- if(iphoneGen==UnityEngine.iOS.DeviceGeneration.iPhone5S)
- {
- topInset=54;
- bottomInset=34;
- }
- else if(iphoneGen==UnityEngine.iOS.DeviceGeneration.iPhone6)
- {
- topInset=64;
- bottomInset=40;
- }
- else if(iphoneGen==UnityEngine.iOS.DeviceGeneration.iPhone6Plus)
- {
- topInset=70;
- bottomInset=44;
- }
- #endif
- if (orientation == UniWebViewOrientation.Portrait)
- {
- return new UniWebViewEdgeInsets(topInset,0,bottomInset,0);
- }
- else
- {
- return new UniWebViewEdgeInsets(topInset,0,bottomInset,0);
- }
- }</span>
三、需要注意的問題
在安卓平台使用最大的問題是Unity失去焦點的問題。經過使用OnApplicationFocus方法測試,調用平台WebView打開界面時默認打開另一個Activity,Unity本身為一個Activity,當打開另外一個Activity時Unity會失去焦點,此時焦點不在Unity程序身上,如果鎖屏或者按Home鍵再打開后只會調出最后一個顯示的Activity,也就是UniWebView打開的網頁,而不是Unity程序。也就是在打開網頁的界面按下Home鍵或者鎖屏后程序將無法正常返回。主要的問題在於Unity程序和打開的網頁屬於不同的Activity,解決的方法為更改Unity工程中的安卓配置文件,使一個Activity繼承於另一個,顯示在同一個Activity上。
另外,打開的網頁有緩存。經過測試,在打開一個網頁后,修改網頁,再次打開,顯示的還是之前的網頁,關閉Unity程序也無法清除緩存。解決的方法為關閉網頁時調用插件自身的CleanCache ()方法,清除緩存,這樣每次打開的都是新的網頁。