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

一、目前有三种方式可以实现在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 ()方法,清除缓存,这样每次打开的都是新的网页。

转载于:https://www.cnblogs.com/nafio/p/9137315.html

UniWebView是用于移动Unity3D游戏的现代Web视图组件。将网页内容集成到游戏从未如此简单。什么是UniWebView UniWebView是一个Unity 3D插件,用于将Web视图组件添加到Unity 3D手机游戏UniWebView在C#包含一组抽象的高级API,它们包装了iOS和Android平台的本机API。借助UniWebView,您可以在不了解本机开发的情况下将某些行为(例如浏览器)插入游戏。当您需要显示公告或通知,为玩家排名添加排行榜或仅向用户显示任何网页时,此功能非常有用。 #支持的平台 UniWebView支持运行: iOS 9.0或以上 Android 5.0(API级别21)或更高版本 在iOS上,UniWebView WKWebView用作渲染组件。在Android WebView使用UniWebView还包含macOS上的Unity Editor支持,用于调试目的。如果要在Mac上开发游戏,则可以直接在Unity Editor的播放模式下打开独立的Web视图。如果您在Windows PC上工作,则仍可以在移动设备上构建和使用UniWebView,但是无法在Windows Unity编辑器直接查看结果。 该编辑器插件是功能齐全的各种移动版本。尽管UniWebView是为移动平台设计的,但如果需要,您也可以将其放入独立的macOS游戏。 #版本3 UniWebView项目始于2013年。UniWebView的原始版本支持Unity4。在Unity 5Unity团队更改了本机插件工作方式的方法,并且无法在同一插件版本同时支持Unity 4和5。因此,我们决定对版本2进行重大升级。经过几年的开发,UniWebView 2现在非常稳定。但是,遗留代码仅UIWebView在iOS上支持旧样式(并且已弃用),并且我们还必须考虑向后兼容性,并且也必须使用过时的API WebView。 我们对这种情况不满意。如果我们使用最新技术,则性能和代码质量可能会大大提高。添加功能和解决问题也将更加容易和快捷。这就是我们决定从头开始重写UniWebView的原因。在版本3,我们再次从0开始,并重新设计了几乎所有API。凭借过去几年的发展经验,我们有机会使美好的事物变得更好,而糟糕的设计也就消失了。 已经在使用UniWebView 2?请查看第3版的重点内容,以了解它是如何从以前的版本演变而来的。请注意,版本3与版本2不兼容。如果要从UniWebView 2升级,则不妨对迁移指南进行简要介绍。大多数概念是相似的,但可能仍需要一段时间才能升级。我们还建议您阅读我们的文档,以将UniWebView的潜在功能带到您的项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值