Unity中內嵌網頁插件UniWebView使用總結


目前有三種方式可以實現在Unity工程中實現內嵌網頁的功能:

1、  UnityWebCore:只支持Windows平台,調用瀏覽器內核,將網頁渲染到mesh,作為gameObject。

2、  Unity-Webview:只適用於Andriod和ios平台,調用移動平台的Webview。

3、  UniWebView:適用於Andriod、ios和Mac os,在移動端效果最好。2.0版本之后支持WP8,不支持windows桌面系統,包括編輯器狀態。

二、使用的主要思路

[csharp]  view plain  copy
 
  1. <span style="font-size:18px;">        void OpenURL()  //打開網址  
  2.         {  
  3.             _cachedView.TitleLabel.text = "資訊";  
  4.             _webView = _uiTrans.gameObject.GetComponent<UniWebView> ();  
  5.             if (_webView == null)   
  6.             {  
  7.                 _webView=_uiTrans.gameObject.AddComponent<UniWebView>();  
  8.                 //_webView.OnReceivedMessage += OnReceivedMessage;  
  9.                 //_webView.OnLoadComplete += OnLoadComplete;  
  10.                 //_webView.OnWebViewShouldClose += OnWebViewShouldClose;  
  11.                 //_webView.OnEvalJavaScriptFinished += OnEvalJavaScriptFinished;  
  12.                   
  13.                 _webView.InsetsForScreenOreitation += InsetsForScreenOreitation;  
  14.             }  
  15.   
  16.             if(InformationManager.Instance.ArticleType == EArticleType.Notice)  
  17.             {  
  18.                 _webView.url = AppManager.Instance.GameIP + "/gatj?ad=" + InformationManager.Instance.ArticleId;  
  19.             }  
  20.             else if(InformationManager.Instance.ArticleType == EArticleType.V)  
  21.             {  
  22.                 _webView.url = AppManager.Instance.GameIP + "/detaifdav.jsp?articleId=" + InformationManager.Instance.VId;  
  23.             }  
  24.             _webView.Load();    //加載網頁  
  25.             ShowOrHide(true);       //控制顯示  
  26.         }  
  27.   
  28.         public void ShowOrHide(bool flag)  
  29.         {  
  30.             if(flag)  
  31.             {  
  32.                 _webView.Show ();  
  33.             }  
  34.             else  
  35.             {  
  36.                 _webView.Hide();  
  37.             }  
  38.         }  
  39.   
  40.         void CloseWeb(UniWebView webView)   //關閉網頁  
  41.         {  
  42.             webView.Hide();  
  43.             UnityEngine.Object.Destroy(webView);  
  44.             //webView.OnReceivedMessage -= OnReceivedMessage;  
  45.             //webView.OnLoadComplete -= OnLoadComplete;  
  46.             //webView.OnWebViewShouldClose -= OnWebViewShouldClose;  
  47.             //webView.OnEvalJavaScriptFinished -= OnEvalJavaScriptFinished;  
  48.             webView.InsetsForScreenOreitation -= InsetsForScreenOreitation;  
  49.             _webView = null;  
  50.         }</span>  

代碼來自實際項目,只提供主要思路。

調用安卓和ios自身平台的方法封裝在jar和mm文件中,提供了UniWebView類調用這些方法。打開網頁時將UniWebView作為組件掛在一個gameObject上。將網址字符串賦值給UniWebView中的url字段,調用Load()方法加載網址,Show()方法顯示在屏幕上,對應Hide()方法。關閉時,先隱藏,再銷毀UniWebView組件。

UniWebView類中提供了一些回調方法,本項目中用到了UniWebViewEdgeInsets。默認打開網頁是全屏方式,UniWebViewEdgeInsets是使網頁偏移。也就是控制網頁顯示的區域和位置。需要注意,在安卓平台插入的值以像素為單位,在ios平台,因為不同機型屏幕scale值不同,同一個值插入效果不一樣,建議判斷機型根據效果將數值寫死:

[csharp]  view plain  copy
 
  1. <span style="font-size:18px;">        UniWebViewEdgeInsets InsetsForScreenOreitation(UniWebView webView, UniWebViewOrientation orientation)   
  2.         {             
  3.             #if UNITY_IOS  
  4.             var iphoneGen=UnityEngine.iOS.Device.generation;  
  5.             if(iphoneGen==UnityEngine.iOS.DeviceGeneration.iPhone5S)  
  6.             {  
  7.                 topInset=54;  
  8.                 bottomInset=34;  
  9.             }  
  10.             else if(iphoneGen==UnityEngine.iOS.DeviceGeneration.iPhone6)  
  11.             {  
  12.                 topInset=64;  
  13.                 bottomInset=40;  
  14.             }  
  15.             else if(iphoneGen==UnityEngine.iOS.DeviceGeneration.iPhone6Plus)  
  16.             {  
  17.                 topInset=70;  
  18.                 bottomInset=44;  
  19.             }  
  20.             #endif  
  21.               
  22.             if (orientation == UniWebViewOrientation.Portrait)   
  23.             {  
  24.                 return new UniWebViewEdgeInsets(topInset,0,bottomInset,0);  
  25.             }   
  26.             else   
  27.             {  
  28.                 return new UniWebViewEdgeInsets(topInset,0,bottomInset,0);  
  29.             }  
  30.         }</span>  


 

三、需要注意的問題

在安卓平台使用最大的問題是Unity失去焦點的問題。經過使用OnApplicationFocus方法測試,調用平台WebView打開界面時默認打開另一個Activity,Unity本身為一個Activity,當打開另外一個Activity時Unity會失去焦點,此時焦點不在Unity程序身上,如果鎖屏或者按Home鍵再打開后只會調出最后一個顯示的Activity,也就是UniWebView打開的網頁,而不是Unity程序。也就是在打開網頁的界面按下Home鍵或者鎖屏后程序將無法正常返回。主要的問題在於Unity程序和打開的網頁屬於不同的Activity,解決的方法為更改Unity工程中的安卓配置文件,使一個Activity繼承於另一個,顯示在同一個Activity上。

另外,打開的網頁有緩存。經過測試,在打開一個網頁后,修改網頁,再次打開,顯示的還是之前的網頁,關閉Unity程序也無法清除緩存。解決的方法為關閉網頁時調用插件自身的CleanCache ()方法,清除緩存,這樣每次打開的都是新的網頁。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM