Unity中内嵌网页插件UniWebView使用总结

一、目前有三种方式可以实现在Unity工程中实现内嵌网页的功能:

1、  UnityWebCore:只支持Windows平台,调用浏览器内核,将网页渲染到mesh,作为gameObject

2、  Unity-Webview:只适用于Andriodios平台,调用移动平台的Webview

3、  UniWebView:适用于AndriodiosMac 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自身平台的方法封装在jarmm文件中,提供了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打开界面时默认打开另一个ActivityUnity本身为一个Activity,当打开另外一个ActivityUnity会失去焦点,此时焦点不在Unity程序身上,如果锁屏或者按Home键再打开后只会调出最后一个显示的Activity,也就是UniWebView打开的网页,而不是Unity程序。也就是在打开网页的界面按下Home键或者锁屏后程序将无法正常返回。主要的问题在于Unity程序和打开的网页属于不同的Activity,解决的方法为更改Unity工程中的安卓配置文件,使一个Activity继承于另一个,显示在同一个Activity上。

另外,打开的网页有缓存。经过测试,在打开一个网页后,修改网页,再次打开,显示的还是之前的网页,关闭Unity程序也无法清除缓存。解决的方法为关闭网页时调用插件自身的CleanCache ()方法,清除缓存,这样每次打开的都是新的网页。

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值