查看: 1437|回复: 0
打印 上一主题 下一主题

[经验分享] 内嵌网页插件UniWebView使用总结

[复制链接]

436

主题

17

听众

4683

积分

中级设计师

Rank: 5Rank: 5

纳金币
1379
精华
9

最佳新人 活跃会员 热心会员 灌水之王 突出贡献 周年庆

跳转到指定楼层
楼主
发表于 2017-2-8 09:17:17 |只看该作者 |倒序浏览
一、目前有三种方式可以实现在Unity工程中实现内嵌网页的功能:
1  UnityWebCore:只支持Windows平台,调用浏览器内核,将网页渲染到mesh,作为gameObject
2  Unity-Webview:只适用于AndriodiOS平台,调用移动平台的Webview
3  UniWebView:适用于AndriodiosMac 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自身平台的方法封装在jarmm文件中,提供了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打开界面时默认打开另一个ActivityUnity本身为一个Activity,当打开另外一个ActivityUnity会失去焦点,此时焦点不在Unity程序身上,如果锁屏或者按Home键再打开后只会调出最后一个显示的Activity,也就是UniWebView打开的网页,而不是Unity程序。也就是在打开网页的界面按下Home键或者锁屏后程序将无法正常返回。主要的问题在于Unity程序和打开的网页属于不同的Activity,解决的方法为更改Unity工程中的安卓配置文件,使一个Activity继承于另一个,显示在同一个Activity上。
另外,打开的网页有缓存。经过测试,在打开一个网页后,修改网页,再次打开,显示的还是之前的网页,关闭Unity程序也无法清除缓存。解决的方法为关闭网页时调用插件自身的CleanCache ()方法,清除缓存,这样每次打开的都是新的网页。

转自:http://blog.csdn.net/onafioo/article/details/51943624


分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|纳金网 ( 闽ICP备08008928号

GMT+8, 2024-6-2 01:24 , Processed in 0.082523 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部