Unity中内嵌网页插件UniWebView使用总结
UniWebView可以帮助Unity移动游戏开发者在Unity中简单地使用系统原生自带的WebView的插件,下面给大家总结了网页插件UniWebView使用方法,一起来看看吧。
一、目前有三种方式可以实现在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 ()方法,清除缓存,这样每次打开的都是新的网页。