一、目前有三种方式可以实现在Unity工程中实现内嵌网页的功能: 1、 UnityWebCore:只支持Windows平台,调用浏览器内核,将网页渲染到mesh,作为gameObject。 2 、 Unity-Webview :只适用于Andriod 和iOS平台,调用移动平台的Webview 。3、 UniWebView:适用于Andriod、ios和Mac os,在移动端效果最好。2.0版本之后支持WP8,不支持windows桌面系统,包括编辑器状态。 二、使用的主要思路 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值不同,同一个值插入效果不一样,建议判断机型根据效果将数值写死: 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 ()方法,清除缓存,这样每次打开的都是新的网页。
转自:http://blog.csdn.net/onafioo/article/details/51943624
|