Unity使用UniWebview插件内嵌H5游戏
最近工作是做Unity內嵌H5游戲,過程中解決了很多生僻的問題。
1. UniWebview的基本使用
在資源商店中下載完插件,拖進Unity里面導入,筆者使用的版本為UniWebview 3。導出完成后可以看到很多腳本文件,還有一些與移動端交互的庫文件(如下圖)。
如果只想要顯示網頁的功能,可以直接將附贈的UniWebView的預制體拖入場景中,填寫網址,勾選Show On Start即可在場景加載好就顯示網頁。(如下圖)
2.自由控制UniWebview
當然,只是使用預制體遠達不到我們的諸多需求,如點擊UI時加載,在界面某區域顯示,切換不同的網址等等。這時候就需要使用動態生成的方式來加載。
Uniwebview會在顯示完一個網頁跳到下一個網頁時,新建UniWebview,銷毀原來的UniWebview組件,所以想要在一個GameObject上掛上一次腳本就可以隨意切換網址的做法是行不通的。
想要打開指定網址的網頁,下列代碼已驗證為有效。
- UniWebview兩種設置網頁顯示區域的方式:分別是
(1).使用RectTranform來劃定顯示區域,可用于嵌入UI。
webView.ReferenceRectTransform=webDisplayPanel;(2).類似使用OnGUI,用Rect值來規定區域大小與位置
webView.Frame = new Rect(0, 0, Screen.width, Screen.height);//表示全屏- 想要在網頁加載時顯示轉圈動畫,控制背景顏色
- UniWebview類其他還有很多參數可以調整,筆者在開發中還沒有使用過,便不再贅述。
3.特殊Scheme鏈接的處理
在H5游戲中,往往會有些鏈接,比如登錄、支付的鏈接,需要跳轉到手機安裝的外部APP中進行操作。而在IOS和Android系統自帶的Webview中,并沒有說明對于這些特殊鏈接如何處理。如果在UniWebview顯示的網頁中打開這些特殊鏈接,會沒有任何反應,嚴重影響用戶體驗。
在解決該問題之前,我們需要知道什么是Scheme,以及它的作用。
scheme是一個網址的頭部,一般的網址都是以http、https為Scheme,表示要訪問一個網頁文件,或是提交一個http請求。Scheme是file的,表示將打開一個本地鏈接…現在用alipay、weixin作為Scheme,還可以直接打開支付寶微信客戶端進行登錄支付等操作,非常方便,也為H5游戲的開發者帶來了相當大的便利。
而UniWebview里擁有一個Scheme攔截的功能,只需要將需要攔截的Scheme,使用下列代碼添加到攔截規則中。
webView.AddUrlScheme("weixin"); webView.AddUrlScheme("alipays");//Android端支付寶 webView.AddUrlScheme("alipay");//IOS端支付寶(注意!!!Android端支付寶scheme是alipays,iOS端是alipay)
有的同學就要問了:“攔截了又有什么用,我Webview還不是打不開這個鏈接嗎?”別急,這就來說說怎么使用攔截功能打開鏈接完成正常的跳轉APP操作。
4.攔截鏈接,并調用系統瀏覽器打開鏈接
UniWebview有一個Scheme攔截的事件OnPageFinished:
public delegate void PageFinishedDelegate(UniWebView webView, int statusCode, string url); public event PageFinishedDelegate OnPageFinished;當頁面加載完成時,該事件會觸發。
UniWebview有一個Scheme攔截的事件OnMessageReceived:
public delegate void MessageReceivedDelegate(UniWebView webView, UniWebViewMessage message); public event MessageReceivedDelegate OnMessageReceived;當檢測到有打開包含攔截規則中的Scheme鏈接時,該事件會觸發。
在創建新的UniWebview時,我們可以頁面加載完成時,添加攔截規則,并添加對攔截事件的監聽。具體代碼如下(豐富了創建UniWebview的過程):
關鍵操作在于ReceivedMessage方法。UniWebViewMessage.RawMessage即為攔截到的未轉碼的鏈接;如果該鏈接中有比如引號、中文等特殊字符,Unity自帶的瀏覽器打開Application.OpenURL方法,是無法使用該鏈接進行打開應用操作的,即使打開了也會報錯。所以通過System.Uri將特殊字符換成Http協議能理解的轉義字符,處理后的鏈接通過Application.OpenURL便可正常打開。
5.后記
在開發過程中,筆者主要卡在了打開支付寶支付鏈接上。因為微信的支付鏈接沒有特殊字符,如果不進行轉碼,支付寶顯示的是訂單過期,而微信卻可以直接跳轉支付,這使得問題變得更加撲朔。加上身邊沒有iOS測試環境,只能通過Android平臺來測試,未曾想過一個鏈接還會分平臺。中間還嘗試了用OC代碼來使用Safari瀏覽器打開鏈接,后來發現跟Application.OpenUrl的作用是一樣的o(╥﹏╥)o,不過也算是一次難忘的體驗。
2020年2月22日01:12:51
6.Uniwebview3 在iOS端改用WKWebView之后的新問題及解決方案
(1)頁面適應Webview的視圖大小
改動之前,默認是自動縮放頁面到視圖大小的,如下圖所示
改動之后,頁面為原網頁的原始設定大小,并且初始位置在右下角,開始展示時完全看不到網頁內容。如下圖所示:
這個問題是可以通過修改Html頁面的代碼來解決的,但是項目中不能修改,只能在Webview上做修改。
解決方式是設置Webview為可縮放:
UniWebView.SetZoomEnabled(bool canZoom);
(2)WKWebview的安全區域限定,劉海屏適配
2020年6月12日14:28:35更新
總結
以上是生活随笔為你收集整理的Unity使用UniWebview插件内嵌H5游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 结果规格化_结果
- 下一篇: 动画 制作_您希望制作的10个醒目的徽标