久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Unity與Ionic混合集成指南:消息鏈路與Vuforia AR實(shí)踐

Unity與Ionic混合集成指南:消息鏈路與Vuforia AR實(shí)踐 簡介面向Unity與Ionic混合開發(fā)者的集成指南聚焦如何將Unity 3D內(nèi)容嵌入Ionic應(yīng)用并實(shí)現(xiàn)雙向消息通信覆蓋Android與iOS平臺(tái)且已通過Vuforia插件實(shí)測(cè)驗(yàn)證。資源適用于需要AR能力、Cordova插件擴(kuò)展或原生橋接的中級(jí)開發(fā)者包含Objective-C、Java、C#等平臺(tái)橋接代碼。壓縮包共21個(gè)文件容量僅424KB主要包含png截圖、mm/java/h原生橋接源碼、plugin.xml配置、xcconfig構(gòu)建設(shè)置、JSON與JS腳本以及IonicComms.cs等通信封裝結(jié)構(gòu)清晰便于對(duì)照集成。已有228人學(xué)習(xí)瀏覽適合正在處理Unity與Ionic跨平臺(tái)通信、Vuforia集成或Cordova插件接入問題的開發(fā)者參考。除可直接復(fù)用的橋接代碼外資源還提供了AppDelegate及IonicComms的完整實(shí)現(xiàn)思路幫助讀者理解Android/iOS雙向消息流與配置要點(diǎn)。1. 從 Unity 到 Ionic為什么這套集成指南把消息鏈路放在第一位把 Unity 3D 畫面嵌進(jìn) Ionic 殼這件事最反直覺的結(jié)論是難點(diǎn)不在「把 Unity 畫面顯示出來」而在「顯示出來之后兩個(gè)運(yùn)行時(shí)之間怎么傳消息」。你拿到這套指南跟著把 Android 側(cè)的 UnityPlayer 和 iOS 側(cè)的 UnityFramework 掛上畫面很快能出但一到 Vuforia 識(shí)別結(jié)果要回傳 Ionic 頁面、Ionic 頁面要控制 Unity 切換場(chǎng)景的時(shí)候生命周期、線程、轉(zhuǎn)義這些問題就會(huì)挨個(gè)暴露。這套資料的價(jià)值在于它把「Unity → 原生 → WebView → JS」這條消息鏈路的每一段都驗(yàn)證過并且跑過 Vuforia 插件真機(jī)測(cè)試。適合做 Unity AR / 3D 展示但殼必須用 Ionic 的團(tuán)隊(duì)也適合想知道混合應(yīng)用里原生渲染層到底怎么協(xié)作的開發(fā)者。2. Cordova 插件層選型三種集成方式與 Unity 導(dǎo)出產(chǎn)物選擇先講為什么非要用插件層。做 Unity 和 Ionic 集成網(wǎng)上能搜到的方案有三大類把 Unity 導(dǎo)出成 WebGL 塞進(jìn) iframe 或 WebView 里Unity 作為獨(dú)立原生 ActivityIonic 跳轉(zhuǎn)過去再跳回來用 Cordova 插件把 Unity 原生視圖嵌進(jìn)當(dāng)前頁面。第一個(gè)方案性能差強(qiáng)人意但 AR 幾乎不可用Vuforia 需要直接操作相機(jī)和傳感器瀏覽器環(huán)境拿不到穩(wěn)定的相機(jī)權(quán)限流第二個(gè)方案能跑 AR但頁面切換黑屏、狀態(tài)丟失而且 Ionic 側(cè)拿不到 Unity 內(nèi)部狀態(tài)消息只能靠 URL Scheme 硬傳。第三個(gè)方案把 Unity 當(dāng)作原生層的一個(gè)模塊由 Cordova 插件統(tǒng)一管理生命周期和消息路由是最穩(wěn)妥的折中。2.1 三種集成思路從 iframe 跳到原生視圖的演進(jìn)先看結(jié)論如果只是展示一段 3D 商品模型、不涉及 AR、不要求消息實(shí)時(shí)性WebGL 導(dǎo)出加 iframe 真的夠用。一旦涉及 Vuforia 這類依賴原生相機(jī)、傳感器時(shí)序的 SDKWebGL 這條路基本是死的Unity 對(duì) WebGL 平臺(tái)本身就不開放原生權(quán)限管線。獨(dú)立 Activity 方案的問題在 Android 側(cè)尤其明顯UnityPlayerActivity 一啟動(dòng)Ionic 頁面進(jìn)入 Paused 狀態(tài)WebView 里的 JS 定時(shí)器全部掛起等 Unity 場(chǎng)景結(jié)束返回Ionic 側(cè)要重新初始化而 Unity 的渲染上下文也被銷毀第二次進(jìn)入等于冷啟動(dòng)。這個(gè)方案的啟動(dòng)耗時(shí)和內(nèi)存峰值都不可控。插件方案的關(guān)鍵差異在于Unity 視圖不擁有 Activity而是像一個(gè)子視圖一樣掛到當(dāng)前 Activity 的 ViewGroup 上。這樣 Ionic 和 WebView 全程存活Unity 只是「渲染層」消息能走內(nèi)存通道而不是 URL。代價(jià)是生命周期必須自己接管返回鍵、onPause、onResume、onDestroy 全要重新分發(fā)到 UnityPlayer漏掉任何一個(gè)環(huán)節(jié)最常見的翻車就是 App 退到后臺(tái)再回來Unity 畫面整個(gè)黑掉。三種方案對(duì)比如下集成方式畫面掛載方式AR 支持消息通道主要限制WebGL iframeWebView 內(nèi)渲染弱JS 直通性能差Vuforia 相機(jī)權(quán)限難拿原生 Activity 跳轉(zhuǎn)整頁覆蓋強(qiáng)URL / Intent頁面重建、狀態(tài)丟失Cordova 插件掛載子視圖嵌入強(qiáng)內(nèi)存直調(diào)生命周期和分發(fā)要自己接管2.2 Unity 導(dǎo)出產(chǎn)物Android 的 unityLibrary 與 iOS 的 UnityFramework我一般會(huì)把 Unity 工程分別導(dǎo)出兩份產(chǎn)物不直接出安裝包。Android 在 Build Settings 里勾選 Export Project導(dǎo)出的是一個(gè)完整的 Gradle 工程我們只取其中的 unityLibrary 模塊。iOS 則需要先以 Framework 方式構(gòu)建生成 UnityFramework.framework 和初始化所需的頭文件。導(dǎo)出前的 Player Settings 是很多人忽略的一步打包方式、架構(gòu)、包名全在這里定死后面再改要重新導(dǎo)出。Build Settings Player Settings - Package Name: 填與 Cordova 插件 applicationId 一致的包名 - Scripting Backend: IL2CPP - Target Architectures: ARM64 - Strip Engine Code: 保持默認(rèn) - Export Project: 勾選導(dǎo)出后你會(huì)看到 unityLibrary 和 launcher 兩個(gè)模塊launcher 是 Unity 自帶的啟動(dòng)殼直接忽略。unityLibrary 里已經(jīng)帶了 AndroidManifest.xml、libs 下的 classes.jar、src/main 下的 UnityPlayerActivity 繼承鏈以及 jniLibs 里的各架構(gòu) .so。這些東西會(huì)整體挪進(jìn) Cordova 插件的 android 目錄由插件自己的 build.gradle 接管。iOS 端稍麻煩一點(diǎn)。Unity 導(dǎo)出 Xcode 工程后產(chǎn)物不是單個(gè) framework 文件而是一堆源碼和依賴。常見做法是把整個(gè) Unity 導(dǎo)出工程作為子工程拖進(jìn)插件 ios 目錄然后在 Cordova iOS 工程的 Build Settings 里配置 UnityFramework 的頭文件搜索路徑和 Link 依賴。如果 Unity 版本較新可以直接用 UnityFramework.framework 的二進(jìn)制產(chǎn)物配合 Unity 官方提供的集成頭文件使用。這一層選型直接影響后續(xù)編譯時(shí)長和 Xcode 兼容性我通常優(yōu)先選 framework 方式因?yàn)榘言创a工程拖進(jìn) Cordova 插件Xcode 版本一換就是一場(chǎng)災(zāi)難。2.3 Cordova 插件的分層從 JS 橋到原生實(shí)現(xiàn)再到 Unity 回調(diào)Cordova 插件的目錄結(jié)構(gòu)建議直接按四層拆消息鏈路會(huì)被這個(gè)分層固定下來后面調(diào)試定位問題會(huì)高效很多UnityBridge/ ├── plugin.xml ├── www/ │ └── UnityBridge.js ├── src/ │ ├── android/ │ │ ├── UnityBridge.java │ │ └── unityLibrary/ # Unity 導(dǎo)出產(chǎn)物 │ └── ios/ │ ├── UnityBridge.mm │ └── UnityFramework/ # Unity 導(dǎo)出產(chǎn)物或 frameworkplugin.xml 負(fù)責(zé)把 JS 橋暴露給 Cordova 運(yùn)行時(shí)、聲明相機(jī)權(quán)限、指定原生實(shí)現(xiàn)類以及把 unityLibrary 加進(jìn)編譯。Android 側(cè)要寫這段配置platform nameandroid config-file targetAndroidManifest.xml parent/manifest uses-permission android:nameandroid.permission.CAMERA / uses-permission android:nameandroid.permission.INTERNET / /config-file source-file srcsrc/android/UnityBridge.java target-dirsrc/com/ionicbridge/unity / /platformCordova 7 之后插件源碼默認(rèn)編譯進(jìn) app 模塊unityLibrary 的 Gradle 模塊能不能被 Cordova 自動(dòng)識(shí)別是第一個(gè)坑。解決方式一般是在插件 build.gradle 里顯式聲明 flatDir 倉庫把 unityLibrary/libs 下的 classes.jar 包進(jìn)來再把 .so 文件在 jniLibs 里重新指向。如果這一步不做編譯能過但運(yùn)行時(shí)會(huì)給你一個(gè) NoClassDefFoundError而且這個(gè)錯(cuò)只在真機(jī)上出現(xiàn)Android Studio 預(yù)覽不會(huì)暴露。JS 橋只做兩件事暴露給 Ionic 頁面一個(gè) sendMessage 方法以及注冊(cè)一個(gè)從原生層推送消息進(jìn)來的回調(diào)。所有 Android/iOS 差異被封裝在原生層Ionic 側(cè)看不到平臺(tái)分支var exec require(cordova/exec); exports.showUnity function (success, error) { exec(success, error, UnityBridge, showUnity, []); }; exports.sendToUnity function (message, success, error) { exec(success, error, UnityBridge, sendMessage, [message]); }; exports.onUnityMessage function (callback) { window.unityMessageCallback callback; };onUnityMessage 里把回調(diào)掛到 window 上是為了讓原生層在任意線程拿到 webView 實(shí)例時(shí)可以直接執(zhí)行一段 javascript 來觸發(fā)回調(diào)繞開 Cordova exec 的回傳鏈路。這套設(shè)計(jì)的實(shí)際收益是Unity 側(cè)發(fā)消息的頻率通常很高如果每幀都走 Cordova 的 callbackContext 排隊(duì)延遲和丟消息會(huì)一起出現(xiàn)。提示插件文件別一次全堆進(jìn)一個(gè)目錄。按 www、src/android、src/ios 分開放后面出問題用 Xcode 或 Android Studio 單獨(dú)打開插件源碼調(diào)試會(huì)快很多。Vuforia 初始化時(shí)如果相機(jī)權(quán)限沒給Unity 側(cè)會(huì)直接卡在黑色相機(jī)預(yù)覽而且不拋任何異常這是我拆這份指南前印象最深的坑。3. Android 端集成UnityPlayer 掛載、Gradle 依賴與生命周期接管Android 端比 iOS 良心的地方在于Unity 官方給了 UnityPlayer 這個(gè)公開類可以直接 new 出來掛到任意 ViewGroup 上。但「可以直接 new」背后的坑是UnityPlayer 的構(gòu)造函數(shù)會(huì)讀 Activity 的 intent、初始化顯示和音頻必須在 Activity resumed 之后創(chuàng)建。Cordova 的插件初始化時(shí)機(jī)比 Activity onCreate 晚不了多少但你很難保證 Unity 底層的 Surface 已經(jīng)就緒。翻車案例我見過不少直接在 pluginInitialize 里 new UnityPlayer結(jié)果一半機(jī)器黑屏、一半機(jī)器直接 crash堆棧指向 libunity.so 里的 EGL 初始化。3.1 plugin.xml 與 build.gradle 的雙重配置先把配置層寫清楚。插件里除了 plugin.xml還必須給 Android 模塊單獨(dú)準(zhǔn)備 build.gradle否則 unityLibrary 引不進(jìn)來。重點(diǎn)有三個(gè)flatDir 倉庫、abiFilters、編譯參數(shù)。abiFilters 尤其關(guān)鍵Unity 導(dǎo)出的 .so 會(huì)帶一波一二十兆的庫如果 Cordova 工程本身默認(rèn)打所有 ABI你的 APK 體積會(huì)直接爆炸還會(huì)在低端機(jī)上報(bào) so 加載沖突。repositories { flatDir { dirs unityLibrary/libs } } android { defaultConfig { ndk { abiFilters arm64-v8a } } } dependencies { implementation project(:unityLibrary) }abiFilters 只保留 arm64-v8a 的前提是團(tuán)隊(duì)確認(rèn)目標(biāo)機(jī)型都是 64 位系統(tǒng)。2023 年后應(yīng)用市場(chǎng)已經(jīng)強(qiáng)制要求 64 位支持但國內(nèi)分發(fā)渠道還有不少 32 位存量設(shè)備如果 OEM 定制 ROM 的 WebView 是 32 位進(jìn)程你只留 arm64 會(huì)導(dǎo)致 Cordova 的 WebView 都能跑、Unity 卻加載不了 so。這個(gè)取舍要根據(jù)渠道來先確認(rèn)再動(dòng)手不要照抄一套配置跑所有包。plugin.xml 里的 source-file 只解決 Java 文件拷入不解決 Gradle 模塊依賴。unityLibrary 整個(gè)目錄要手動(dòng)復(fù)制進(jìn)插件工程然后在 settings.gradle 的 include 順序里把它排在 Cordova 自帶 app 模塊之前否則 Gradle 找不到模塊報(bào)錯(cuò)信息是「Project with path :unityLibrary could not be found」跟依賴本身沒關(guān)系純粹是 include 漏了。3.2 UnityPlayer 的創(chuàng)建時(shí)機(jī)與視圖掛載具體到代碼我推薦的做法是不在 pluginInitialize 里創(chuàng)建而是在 Ionic 頁面準(zhǔn)備好、JS 顯式調(diào)用 showUnity 時(shí)再懶創(chuàng)建。這樣做有兩個(gè)直接好處一是避免 App 啟動(dòng)即拉起 Unity 導(dǎo)致冷啟動(dòng)時(shí)間被拖長二是保證 Activity 已經(jīng)處于 resumed 狀態(tài)EGL 初始化成功率會(huì)高很多。對(duì)需要預(yù)加載的場(chǎng)景第 6 章會(huì)單獨(dú)給方案這里先把懶加載跑通。public class UnityBridge extends CordovaPlugin { private UnityPlayer unityPlayer; private FrameLayout unityContainer; Override public boolean execute(String action, JSONArray args, CallbackContext cb) { if (showUnity.equalsIgnoreCase(action)) { cordova.getActivity().runOnUiThread(() - showUnity()); return true; } if (sendMessage.equalsIgnoreCase(action)) { String msg args.optString(0); if (unityPlayer ! null) { unityPlayer.UnitySendMessage(NativeBridge, OnMessageFromJS, msg); cb.success(); } else { cb.error(unity not ready); } return true; } return false; } private void showUnity() { if (unityPlayer ! null) return; Activity activity cordova.getActivity(); unityPlayer new UnityPlayer(activity); unityContainer new FrameLayout(activity); FrameLayout.LayoutParams params new FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); unityContainer.addView(unityPlayer, params); ((ViewGroup) webView.getParent()).addView(unityContainer, 0); } }這段 Java 有幾個(gè)點(diǎn)值得說明。showUnity 里先判斷 unityPlayer 是否為空避免重復(fù)創(chuàng)建UnityPlayer 是重量級(jí)對(duì)象重復(fù) new 兩次會(huì)導(dǎo)致原生崩潰因?yàn)榈讓?GL 上下文和渲染線程沒有清理干凈。addView 到 webView.getParent() 時(shí)插到第 0 位是為了把 Unity 視圖放在 WebView 底下這樣如果需要顯示 HTML 覆蓋層WebView 仍然在頂部反過來如果 Unity 要蓋住全部頁面就把 unityContainer 的 index 改成最后一位。JS 的 showUnity 調(diào)用要帶上 Cordova 的 ready 回調(diào)不要在 deviceready 事件之前調(diào)。常見做法是在 Ionic 的某個(gè)頁面生命周期里先 await deviceReady再 exec 原生方法這樣時(shí)間線上不會(huì)撞上 WebView 還在加載的窗口期。如果 App 啟動(dòng)后秒進(jìn) Unity 頁面這條時(shí)序尤其敏感Ionic 的 ionViewDidEnter 才是安全點(diǎn)ionViewDidLoad 都偏早。3.3 生命周期分發(fā)返回鍵、onPause、onResume 與 onDestroy生命周期這塊是 Android 端最容易漏的部分。UnityPlayer 不是普通 View它內(nèi)部持有獨(dú)立的渲染線程和 GL 上下文。Activity 的 onPause 沒有轉(zhuǎn)發(fā)給 UnityPlayer 時(shí)Unity 的時(shí)序直接和系統(tǒng)消息隊(duì)列錯(cuò)位Unity 認(rèn)為還在前臺(tái)繼續(xù)渲染但 Surface 已經(jīng)被系統(tǒng)回收畫面停留在最后一幀觸摸還能收到但點(diǎn)擊失效反過來 onResume 漏了Unity 不會(huì)重新請(qǐng)求渲染畫面永久黑屏。所以插件要覆寫 CordovaPlugin 對(duì)應(yīng)的生命周期回調(diào)。Override public void onPause(boolean multitasking) { if (unityPlayer ! null) unityPlayer.pause(); super.onPause(multitasking); } Override public void onResume(boolean multitasking) { super.onResume(multitasking); if (unityPlayer ! null) unityPlayer.resume(); } Override public void onDestroy() { if (unityPlayer ! null) { unityPlayer.quit(); unityPlayer null; } super.onDestroy(); }onDestroy 里的 unityPlayer.quit() 必須做。不做的話 Unity 的 native 線程會(huì)懸掛在后臺(tái)線程里Activity 銷毀后 JVM 里殘留一堆 RenderThread下次創(chuàng)建 UnityPlayer 時(shí)這些線程會(huì)和新實(shí)例搶 GL 上下文輕則卡頓重則閃退。我一般還會(huì)在 quit 后把 ViewGroup 里的 Unity 視圖 removeAllViews確保 WebView 回到頂層時(shí)不會(huì)出現(xiàn)透明黑塊殘影。返回鍵也是重災(zāi)區(qū)。默認(rèn)情況下返回鍵直接讓 Activity finishUnityPlayer 跟著銷毀Ionic 頁面也回不去了。實(shí)際項(xiàng)目中常見做法是在 Unity 顯示期間攔截返回鍵先通知 Unity 清理場(chǎng)景并隱藏視圖不直接 finish Activity在 WebView 顯示期間才讓返回鍵執(zhí)行頁面返回。插件里通過 overrideUrlLoading 或 WebView 的硬件返回鍵監(jiān)聽都能做到但這個(gè)容易被測(cè)試漏掉等上線后用戶按了返回鍵整個(gè) App 沒了才意識(shí)到分發(fā)沒做。4. iOS 端集成UnityFramework 橋接、Objective-C 轉(zhuǎn)發(fā)與雙向消息閉環(huán)iOS 端和 Android 最大的區(qū)別是沒有像 UnityPlayer 這樣可以直接 new 的公開類。Unity 在 iOS 上是一個(gè)完整的 app 生命周期UnityAppController 負(fù)責(zé)接管 UIApplicationDelegate。要把 Unity 嵌進(jìn) Ionic本質(zhì)上是在 Cordova 的 WKWebView 之外再掛一個(gè) UnityAppController 的 rootViewController.view。整個(gè)過程依賴一個(gè)關(guān)鍵文件UnityAppController.h它在 Unity 導(dǎo)出工程里里面定義了你需要 hook 的方法。4.1 UnityFramework 初始化與視圖掛載順序如果你采用新版 UnityFramework.framework 方式初始化流程大致是獲取單例、設(shè)置 dataBundleId、調(diào)用 runUIApplicationMain 完成啟動(dòng)、再把 appController 的 rootView 掛到當(dāng)前 window。這里有一個(gè)玄學(xué)點(diǎn)必須在 UIApplication 事件循環(huán)已經(jīng)穩(wěn)定之后再跑 runUIApplicationMain否則 Unity 的 main run loop 和 WKWebView 的 run loop 會(huì)互相干擾表現(xiàn)為首次旋轉(zhuǎn)屏幕就崩潰而且只在真機(jī)上復(fù)現(xiàn)模擬器很難觸發(fā)。#import UnityFramework/UnityFramework.h #import UnityAppController.h implementation UnityBridge (void)launchUnityOnView:(UIView *)superview { static UnityFramework *unityFramework nil; static dispatch_once_t onceToken; dispatch_once(onceToken, ^{ unityFramework [UnityFramework getInstance]; [unityFramework setDataBundleId:com.example.unitybridge]; [unityFramework runUIApplicationMainWithArgc:0 argv:NULL]; UIView *unityView [unityFramework appController].rootView; unityView.frame superview.bounds; unityView.autoresizingMask UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [superview insertSubview:unityView atIndex:0]; }); } end注意 runUIApplicationMainWithArgc 傳 0 和 NULL是因?yàn)?Unity 不在這條路徑上接收 app 級(jí)參數(shù)如果你傳了 UIApplicationMain 需要的 argc/argv會(huì)和 Cordova 自己的生命周期入口沖突輕則啟動(dòng)卡死重則編譯期符號(hào)沖突。dataBundleId 要和 Unity 導(dǎo)出工程里的 Bundle Identifier 保持一致不一致時(shí) Unity 的初始化回調(diào)不會(huì)觸發(fā)視圖掛上去是一個(gè)白板。掛載時(shí)用 insertSubview:atIndex:0 而不是 addSubview這樣 WKWebView 保持在最上層JS 層可以覆蓋 UIUnity 相機(jī)畫面不會(huì)擋住 Ionic 的加載動(dòng)畫。4.2 Objective-C 橋C 函數(shù)導(dǎo)出與消息轉(zhuǎn)發(fā)到 WKWebViewiOS 上 Unity 發(fā)消息給外部不能直接到 JS必須經(jīng)過一個(gè) C 函數(shù)中轉(zhuǎn)。Unity 官方對(duì)外的 C 接口是 UnitySendMessage從原生到 Unity反過來 Unity 調(diào)原生需要你注冊(cè) C 函數(shù)并在 Unity 側(cè)用 DllImport 聲明。Cordova 插件是 Objective-C 文件寫 extern C 是標(biāo)準(zhǔn)做法不用擔(dān)心 C 名字修飾吃掉函數(shù)符號(hào)。Unity 側(cè)發(fā)給 iOS# if UNITY_IOS [DllImport(__Internal)] private static extern void UnityToIonicMessage(string message); #endif public static void SendToIonic(string message) { #if UNITY_IOS UnityToIonicMessage(message); #endif }C# 側(cè)通過 DllImport 拿到這個(gè) C 入口傳參時(shí) Unity 會(huì)自動(dòng)把字符串轉(zhuǎn)成 char*。Objective-C 側(cè)接收后必須在主線程轉(zhuǎn)發(fā)因?yàn)?Unity 的 C# 調(diào)用可能來自渲染線程直接操作 WKWebView 會(huì) crash。這個(gè) crash 的堆棧永遠(yuǎn)指向 WebKit 內(nèi)部的 evaluateJavaScript很容易讓人誤以為是 WebView 的問題實(shí)際是線程錯(cuò)了。extern C void UnityToIonicMessage(const char *message) { NSString *msg [NSString stringWithUTF8String:message]; dispatch_async(dispatch_get_main_queue(), ^{ [[UnityBridge shared] forwardToWebView:msg]; }); } - (void)forwardToWebView:(NSString *)msg { NSString *escaped [self escapeJavaScriptString:msg]; NSString *js [NSString stringWithFormat: window.unityMessageCallback window.unityMessageCallback(%);, escaped]; [self.webView evaluateJavaScript:js completionHandler:nil]; }forwardToWebView 里的 escapeJavaScriptString 必須處理單引號(hào)、雙引號(hào)和反斜杠否則 Unity 的 JSON 字符串一到 JS 側(cè)就被截?cái)唷_@個(gè)坑在 Android 端也有但 Android 用 loadUrl(javascript:...) 時(shí)轉(zhuǎn)義錯(cuò)誤只會(huì)靜默失效iOS 的 evaluateJavaScript 會(huì)直接報(bào) JS 語法錯(cuò)誤定位反而容易一些。如果你傳的是帶換行的日志文本不轉(zhuǎn)義的話 JS 引擎直接拋錯(cuò)回調(diào)永遠(yuǎn)不觸發(fā)。從 JS 到 Unity 的通道在 iOS 上沒有 UnityPlayer.UnitySendMessage 可用需要走 UnityFramework 的 sendMessageToGOWithName- (void)sendToUnity:(NSString *)message { UnityFramework *uf [UnityFramework getInstance]; [uf sendMessageToGOWithName:NativeBridge functionName:OnMessageFromJS message:message]; }C# 側(cè)對(duì)應(yīng) GameObject 上掛的腳本要有一個(gè)公開方法接收字符串。UnityFramework getInstance 拿到的是同一個(gè)單例所以 sendMessageToGOWithName 必須等 Unity 啟動(dòng)完成后再調(diào)這個(gè)時(shí)序問題和 Android 側(cè) UnityPlayer 未創(chuàng)建就發(fā)消息是同一個(gè)坑只是表現(xiàn)更隱蔽不發(fā)任何錯(cuò)誤日志消息直接丟進(jìn)黑洞。4.3 雙端消息鏈路的差異為什么 iOS 的消息時(shí)序比 Android 更難觀測(cè)Android 端 UnitySendMessage 是即時(shí)調(diào)用Unity 的 C# 側(cè)在同一執(zhí)行棧同步收到iOS 端 sendMessageToGOWithName 最終會(huì) post 到 Unity 主線程調(diào)用是異步的。所以 iOS 上 JS 連續(xù)發(fā)兩條消息時(shí)Unity 收到的順序可能與發(fā)送順序不完全一致尤其在消息量大、跨線程調(diào)度忙的時(shí)候。我的用法是Unity 側(cè)不做順序假設(shè)統(tǒng)一用一個(gè)隊(duì)列消費(fèi)消息參考第 6 章的做法不要指望兩條消息之間有任何 happens-before 關(guān)系。Android 端 Unity 調(diào)原生 Java 的路徑也有差異Unity 調(diào) AndroidJavaObject 時(shí)是在 Unity 渲染線程執(zhí)行Java 方法里如果直接操作 View 必須 runOnUiThread否則系統(tǒng)不會(huì)崩但視圖不會(huì)刷新——典型的「日志全對(duì)、UI 不動(dòng)」。iOS 端因?yàn)?dispatch_async(dispatch_get_main_queue()) 強(qiáng)制回主線程反而少踩這個(gè)坑。雙端對(duì)比下來Android 的黑匣子在 EGL 初始化iOS 的黑匣子在 run loop 時(shí)序。5. 避坑清單Vuforia 相機(jī)、黑屏、消息丟包與手勢(shì)沖突這章直接列五條我在拆這套集成方案時(shí)踩過的坑全部按「現(xiàn)象 → 原因 → 解決」的順序?qū)?。前兩條是關(guān)于畫面能不能出來后三條是關(guān)于畫面出來之后消息和交互能不能正常工作。5.1 Unity 黑屏但不崩潰EGL 初始化時(shí)序與 Surface 未就緒現(xiàn)象Unity 視圖掛在頁面上Activity 不崩潰Logcat 里沒有任何異常但畫面是黑的。用 adb shell dumpsys SurfaceFlinger 能看到 Surface 存在但內(nèi)容一直是全黑。原因UnityPlayer 的構(gòu)造函數(shù)在 Activity 還沒完全 resumed 時(shí)就執(zhí)行了。Unity 底層嘗試創(chuàng)建 EGLSurface 時(shí)拿到的 Display 和 Window 都處于不可用狀態(tài)Unity 選擇靜默等待而不是拋異常于是渲染線程空轉(zhuǎn)畫面出不來。這個(gè)問題在 Android 10 以上的設(shè)備尤其明顯因?yàn)橄到y(tǒng)對(duì) Surface 的有效期校驗(yàn)更嚴(yán)格。解決把 UnityPlayer 的創(chuàng)建時(shí)機(jī)從 pluginInitialize 移到首次調(diào)用 showUnity 時(shí)并且在 cordova.getActivity() 的 onResume 完成之后再執(zhí)行。我一般在 showUnity 里加一個(gè) handler.postDelayed 延遲 100 到 200 毫秒給 Activity 的 decorView 一輪布局時(shí)間黑屏概率能降到接近零。5.2 觸摸全部被 WebView 吃掉Unity 區(qū)域的點(diǎn)擊無效現(xiàn)象Unity 畫面顯示正常但點(diǎn)擊 Unity 里的按鈕沒有任何反應(yīng)觸摸事件全部落在頁面底層的 WebView 上Unity 場(chǎng)景收不到任何輸入。原因Cordova 的 WebView 默認(rèn)攔截所有觸摸事件UnityPlayer 作為一個(gè)后加入的兄弟視圖在 touch 事件分發(fā)鏈上排在 WebView 后面根本拿不到事件。很多人以為加一個(gè) onTouchListener 就能解決實(shí)際上 WebView 的 touch 事件在父容器層面就被消費(fèi)了。解決在 Unity 視圖顯示期間臨時(shí)讓 WebView 不再接收觸摸事件。常見做法是給 WebView 加一個(gè)透明的 preventTouch 覆蓋層或者在原生層重寫 dispatchTouchEvent當(dāng) Unity 視圖可見且手指落在 Unity 區(qū)域時(shí)事件直接分發(fā)給 UnityPlayer不經(jīng)過 WebView。手勢(shì)沖突的邊界條件是Unity 視圖是矩形但 Vuforia 識(shí)別區(qū)域經(jīng)常是半透明的HTML 覆蓋層如果也要響應(yīng)點(diǎn)擊就得在 JS 側(cè)做命中測(cè)試原生層只把事件分發(fā)給最上層的視圖。5.3 消息發(fā)了但 Unity 沒反應(yīng)GameObject 和腳本方法名不匹配現(xiàn)象JS 調(diào)用 sendToUnity 返回 successC# 側(cè)沒有任何日志輸出Unity 場(chǎng)景沒有任何變化。原因UnitySendMessage 的底層實(shí)現(xiàn)是反射查找。如果 GameObject 名稱不存在或者腳本掛載的 GameObject 上找不到對(duì)應(yīng)的公開方法Unity 會(huì)靜默失敗只在 Editor 日志里打一條 warning真機(jī) Release 包連 warning 都沒有。最常見的是把方法名大小寫寫錯(cuò)或者把腳本掛在了子 GameObject 上但消息發(fā)給了父節(jié)點(diǎn)。解決在 Unity 側(cè)建一個(gè)名為 NativeBridge 的空 GameObject把所有外部消息入口集中在一個(gè)腳本里腳本方法名寫死并保持 public。我還會(huì)在 Start() 里 Debug.Log 一條「Bridge Ready」真機(jī)連上 adb logcat 掃這條日志就能確認(rèn) Unity 側(cè)監(jiān)聽已就位。排查順序是先確認(rèn) GameObject 名稱再確認(rèn)方法名最后確認(rèn)腳本是 active 狀態(tài)。5.4 Vuforia 相機(jī)畫面黑底或權(quán)限彈窗延遲現(xiàn)象Vuforia 初始化的 AR 場(chǎng)景里目標(biāo)物識(shí)別正常但背景畫面是黑的或者相機(jī)權(quán)限彈窗在 Unity 啟動(dòng)后五秒才出現(xiàn)。原因Vuforia 需要在引擎啟動(dòng)時(shí)拿到相機(jī)權(quán)限但 Android 運(yùn)行時(shí)權(quán)限回調(diào)沒有同步給 UnityVuforia 等待授權(quán)超時(shí)后退出相機(jī)初始化只剩識(shí)別邏輯在跑。權(quán)限彈窗延遲的原因更直接插件在 plugin.xml 里聲明了權(quán)限但 Ionic 頁面調(diào)用 showUnity 時(shí)沒有先申請(qǐng)運(yùn)行時(shí)權(quán)限系統(tǒng)彈窗被 WebView 的焦點(diǎn)搶走延遲到用戶觸摸屏幕才觸發(fā)。解決在 showUnity 之前用 Ionic Native 的 CameraPreview 或 capacitor/dialogs 先申請(qǐng) CAMERA 權(quán)限拿到授予結(jié)果后再 exec 原生 showUnity。iOS 側(cè)對(duì)應(yīng)的是 NSCameraUsageDescriptionInfo.plist 里必須有這個(gè)鍵否則應(yīng)用直接閃退。還有一個(gè)細(xì)節(jié)Vuforia 識(shí)別畫面如果帶透明通道Unity 相機(jī)的 Clear Flags 要設(shè)成 Solid Color 且 Alpha 為 0否則 WebView 背景會(huì)從黑塊變成灰塊。5.5 消息頻率一高就丟回調(diào)阻塞在 WebView 的 JS 執(zhí)行隊(duì)列現(xiàn)象低頻消息一切正常Unity 每秒鐘發(fā)超過 20 條消息時(shí)JS 側(cè)接收到的數(shù)量明顯少于發(fā)送數(shù)量控制臺(tái)沒有報(bào)錯(cuò)。原因原生層通過 loadUrl 或 evaluateJavaScript 執(zhí)行 JS 回調(diào)時(shí)WKWebView 不是多線程安全的頻繁調(diào)用會(huì)讓 WebView 的 JS 執(zhí)行隊(duì)列持續(xù)堆積。當(dāng)執(zhí)行隊(duì)列滿的時(shí)候新的 evaluateJavaScript 會(huì)被系統(tǒng)丟棄而且沒有任何回調(diào)通知你丟了。Cordova 的 exec 通道也有類似問題高頻率回調(diào)必須走自定義事件機(jī)制而不是 exec。解決Unity 側(cè)不要每幀都發(fā)消息把需要上報(bào)的數(shù)據(jù)收集到一個(gè)隊(duì)列按 100 或 200 毫秒的間隔批量發(fā)。JS 側(cè)用 Array 臨時(shí)緩存 incoming 消息統(tǒng)一在一個(gè) setInterval 里消費(fèi)避免每一條消息都觸發(fā) Angular 的變更檢測(cè)。實(shí)際測(cè)試下來把頻率降到每秒 10 次以內(nèi)丟包率從 15% 降到 0。6. 進(jìn)階以幀對(duì)齊的消息協(xié)議與 Unity 預(yù)加載策略把雙端鏈路跑通之后下一步要解決的是「消息亂序」和「首屏速度」兩個(gè)體驗(yàn)問題。先說消息協(xié)議我在 Unity 側(cè)不會(huì)直接在收到消息的方法里處理業(yè)務(wù)邏輯而是維護(hù)一個(gè)線程安全的隊(duì)列統(tǒng)一在 Update 里消費(fèi)。原因前面提過iOS 端 sendMessageToGOWithName 是異步投遞多條消息的分派順序不保證Android 端雖然是同步調(diào)用但調(diào)用方可能來自不同線程。所有入口消息先進(jìn)隊(duì)列在 Unity 主線程的 Update 里按幀處理可以保證同一幀內(nèi)狀態(tài)一致不會(huì)出現(xiàn)「上一條還在執(zhí)行、下一條已經(jīng)把場(chǎng)景切換了」的競爭。public class NativeBridge : MonoBehaviour { private readonly Queuestring pending new Queuestring(); private readonly object gate new object(); public void OnMessageFromJS(string message) { lock (gate) { pending.Enqueue(message); } } void Update() { lock (gate) { while (pending.Count 0) { ProcessMessage(pending.Dequeue()); } } } private void ProcessMessage(string msg) { // 在這里做 JSON 解析和業(yè)務(wù)分發(fā) } }這個(gè)隊(duì)列的另一個(gè)好處是Unity 側(cè)向原生層上報(bào)數(shù)據(jù)時(shí)也可以用同樣的思路在 Update 里把狀態(tài)寫入一個(gè) StringBuilder定時(shí) flush 給 iOS / Android 橋避免高頻回調(diào)撐爆 WebView 執(zhí)行隊(duì)列。消息協(xié)議層我一般再加一個(gè)兩字節(jié)的序號(hào)前綴JS 側(cè)收到后能補(bǔ)上亂序造成的時(shí)序缺口。再說預(yù)加載策略App 啟動(dòng)后如果用戶大概率會(huì)進(jìn) Unity 頁面可以在 Ionic 的 app 初始化階段后臺(tái)創(chuàng)建一個(gè) UnityPlayer但不掛載到 ViewGroup。這樣等用戶真實(shí)進(jìn)入 AR 頁面時(shí)Unity 已經(jīng)完成 EGL 初始化和場(chǎng)景加載showUnity 只是做一個(gè) addView首屏?xí)r間可以縮短 60% 以上。代價(jià)是 Unity 的渲染線程會(huì)在后臺(tái)常駐內(nèi)存占用至少增加 150 到 250 兆具體取決于場(chǎng)景資源大小。低端機(jī)建議做「預(yù)加載待命」到「真正掛載」之間加一個(gè)二段式超時(shí)超過五秒仍未進(jìn)入 Unity 頁面就銷毀避免用戶全程沒碰 AR 卻白白占用內(nèi)存。最后補(bǔ)一個(gè)驗(yàn)證技巧在 Unity 側(cè)放一個(gè)每秒上報(bào)一次當(dāng)前幀率的心跳消息JS 側(cè)用這個(gè)心跳來持續(xù)確認(rèn)整條鏈路是活的。一旦心跳斷了重點(diǎn)關(guān)注三個(gè)方向原生層線程是否切錯(cuò)、WebView 是否處于前臺(tái)、Unity 進(jìn)程是否被系統(tǒng)回收。這套心跳邏輯不復(fù)雜但排查消息問題時(shí)能省掉一半猜謎時(shí)間。從那以后我每次做混合渲染的項(xiàng)目都會(huì)強(qiáng)制先跑通心跳驗(yàn)證再往上疊業(yè)務(wù)功能雙端導(dǎo)出的產(chǎn)物也會(huì)第一時(shí)間核對(duì)包名和 Bundle Identifier 是否一致省得后面整體推倒重來。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99re在线观看| 精品无码久久久久久久久果冻糖心| 亚洲欧美啪啪| 97操b| 国产成人久久精品蜜臀| 三男一女不戴套的A片| 日韩成人性爱AV| 黄网在线播放| 色九九九综合| 久操精品网| 淫荡少妇免费| 六月丁香网| 毛片视频白嫩| 九九九九一区| 亚洲乱色熟女一区| 色婷婷久久| 亚洲天堂第一页| 在线小说视频一区| a'v在线资源| 欧美三级中文字幕hd| 在线黄页看毛片| 欧美 亚洲 另类 综合| 亚洲女人91| 91露脸熟女专区| 人人扣人人操| 97色妞| 亚洲一区二区中文字幕| 中文字幕人成乱码熟女香港| 色色婷| 欧美韩国你懂得在线 | 久久色一区| 91真人天天在线| 精品少妇999| aaaa少妇高潮大片| 亚洲三级网址久久最新| juliaann欧美丝袜办公室| se吧提供91精品国产91久久久久久| 一区三区啪啪| 啊啊啊啊啊好舒服视频| 91精品微拍福利| 国产 码在线成人网站| 粉嫩国产精品久久久| 91狠狠综合久久| 精品成人无码| 麻豆视频test| 竹菊一区二区三区AV线| 伊人久久在线视频观看| 中文字幕91综合| 亚州五月| 国产又大又硬又长又粗| 人妻黑丝袜电影| 日韩一级二级三级免费看完整版| 六月婷婷色综合| 东北女人的毛片| 午夜啊啊| 国产欧美一区激情交| 欧美最婬乱婬爆婬性视频| 久久亚洲一区二区色婷婷| 久久久久久久久久久免费精品| 日本 欧美 亚中文字幕| 人妻喷水| 91天堂色男人的天堂| 九九九九免费高| 黄色大片视频在线免费看| 人妻熟女av国产网站| 无码视频一区二区| 69XX一中文字幕人妻91| oumeisetu综合| 人妻少妇无码| 亚洲成人性爱在线观看| 欧美一级欧美三级在线观看| 欧美组图日韩亚洲中文字幕| 九久9热| 欧美劲爆第一页| 丁香五月综合| 人妻少妇精品久久久久久久| 国产欧美一区二区| 日本孕妇一区二区视频操逼免费看 | 亚洲综合999| 亚洲色欲天天人妻无码系列专区| 久草电影网| 午夜男人一级A片7777| 亚洲高清男人天堂| 逼操网站| 99精品人人爽| 久久久免费的精品| 水滴偷拍| 欧美综合97www| 日本一区不卡| 国产精品91一样| 欧美综合网| 天堂蜜桃无码视频一区二区| 97色网| 狼人综合婷婷激情四射| 97超碰人人操人人操| 天天添天天干电影| 亚洲天堂在线怕怕视频| 97超碰逼| 郑州宾馆老熟女露脸啪啪| 色哟哟av网址| av在线资源| 久久久亚洲熟妇资源| 国产高潮AA片免费看| 久久久久熟女| 久久国产精品91| 高清国产无码av| 99综合自拍| 婷婷丁香九月| 国产精品丝袜在线| 欧亚乱色熟一区二区三四区| 日本黄大片在线观看视频| 欧美天天拍| 国内毛片欧美香蕉精品| 亚洲自拍一区夜夜操| 国产91精品福利在线| 久久久久久裸体| 亚洲日韩美国人妻| 久久女女| 中文字幕日韩国产传媒欧美精品| 国产资源中文字幕在线| 亚州综合AⅤ| 国模精品娜娜一二三区| 欧美天天| 久久视频,这里只有精品 | sewuyueav| 91亚·色| 成年人一级黄色毛片大全在线观看| 青青草影视蜜久久| 俺去久久| 国产一级做a爰大片免费久久| 久久香蕉国产线看观看亚洲女人| 伊人国产视频| 91色色色| 男女激烈网站最新| 四虎在线视频| 制服丝袜第二页| av中文在线| 性videos欧美熟妇hdx| 亚洲一区二区 麻豆传媒| 1769精品一区二区三区| 香伊人在线| 中文字幕第95页| 91精品电影18| 久久99午夜精品一区人妻| 欧美+日产+中文| 久久鲁夜| 麻豆 欧美 日韩| 黄色一区二区秘书性感| 91亚洲色图| 欧洲精品欧洲精品| 中文字幕55555| 婷婷去俺也去六月色| 丝袜 中出 制服 人妻 美腿 中文字幕| 超碰性爱97| 久久久九九网站| 性久久久| 中文字幕99999| jiujiujiujingpin| 开心六月色| 99热这里是精品| 午夜超爽| J?P?NESEHD熟女熟妇伦| 在线看污网站| 人人操人人射人人干| 国产91美女高潮| 亚洲成人福利电影免费| 91网九色蝌蚪操熟女| 青青青在线高清视频在线一二三四区| 久久伦理视频久久大香蕉视频| 夜色五月天| 三级网色| 人人摸.人人色| 777超碰| 少妇丝袜在线观看AV| 哈哈操电影AV| 日本久久久久久久久| 97人人模人人爽人人| 一本久道在线综合视频| 成年人网站在线免费观看| 中文字幕第7页| 粉嫩小泬久久久一区二区| 久都青青视频| 91网站18在线观看| 色欧美天天| 久久艹逼视频| 久草免费在线一区二区| 交换娇妻呻吟声不停中文字幕| 97日韩| 国产91 丝袜在线播放| 国产精品乱码久久久| 91成人亚洲色图| 不卡六六在线91| 九九九九精品一区| 啊啊啊啊啊好大好舒服想要| 久草视频制服诱惑| 2001天天操| 嗯啊不要在线| 五月天色图| 91精品国产综合久久久蜜臀| 九九热九九热| 久久色人体| 亚洲国产第一页综合视频| 日本福利二区视频| 97色碰| 国模精品一区二区三区苹果色戒| 日本福利二区视频| 亚洲色欲天天人妻无码系列专区| 国内三级自拍小视频在线观看 | 日韩精品-原创伙伴| 色约约一区=区三区| 亚洲综合嫩| 亚洲天堂一二| 九九热AV| 久久双插| 人妻 中文 日韩| 国产a片操逼| 国产大陆天天艹| se01国产在线视频| 人人操,操人人| 99久久精品无码一区二区| 玖玖爱免费观看视频| 亚洲综合中文字幕有码 | 性一级黄色录像片网站导航| 日日骚中文字幕| 国产精品九九九| 成人无码欧美一级A片狼牙直播| 亚洲骚逼少妇| 大香蕉伊人网| 第四色奇米影视777| 乱伦1色页| 户外裸露刺激视频第一区| 国产高清精品福利| 欧美日韩成人在线| 天美一二三在线观看Av| 中文字幕女同在线| 一本一道久久综合久久| 无码78| AV乱伦专区| 老熟女乱子伦中文字幕一区二区 | 久操视频在线| 九七超碰| 强奸乱伦大香蕉| 日韩免费看黄片| 日本三级韩国三级99| 加勒比在线视频| 亚洲欧洲无码97久久精品| 亚洲伊人久久精品影院| 啊啊啊慢点| 91oumei| caopeng97| 精品亚洲一区在线观看| 婷婷五月天无码| 伊人久久大香大香线蕉中文| 密臀在线视频| 中文一区二区婷婷视频| 性在久久久久久| 台湾佬大香蕉| 人妻 欧美 中文| 围产精品一区二区三区视频播放| 欧洲亚洲人妻无码高清久久三区四区| 99re6国产精品99re在线| 蜜臀AV秘一区翔田千里| 亚洲第一视频 欧美风情 日韩| 91大学精品激情戏| 草草影院最新网址| 久久久久久久性爱| 超碰久久精品| 男人的天堂在线2| 丰满人妻aA一区二区三区| 97频视在线| 99啪啪| 97欧美综合| AV丝袜少妇| 99精品成人免费看| 97在线观看| 狠狠亚洲| 97舔舔| 亚洲无码免费看| 96一区二区| 97久久免费| 五月丁香啪啪啪| 99久久久久久亚洲精品不卡| 日日AAvv| 精品一国2| 神马精品视频| 搡老熟女老女人老熟妇免费视频| 久久久久亚洲Av无码专区老牛影视 | 无码聚合| 日韩欧洲操屄视频| 日韩一卡二卡三卡| 久久久成人免费av电影| 手机不卡视频不卡在线一二三区| 五月婷视频| 亚洲欧综合另类无码一区| 亚洲天天综合| 78操B| 婷婷精品久久av影视| 欧美少妇性乱| 日产中文字幕2020| 亚91亚洲网| 伊人成人中文字幕久久网| 国产免a费看黄片在线| 亚洲精品熟妇1区2区3区。| 神马久久啊啊| 中文字幕第23区| 欧美成人亚洲精品| 亚洲色欲一区二区三区| 91久久精品国产| 男人的天堂2010| 日本日逼视频网| 韩国三级理论在线| 日本精品第一视频在'| 神马久久久久久伦理片| 中文字幕精品一区欧美| 中文日本免费高清| 高清无码 国产精品| 亚洲春色激情小说| 激情四射婷婷四五月天| 97色在线观看| 一区 欧美 日韩 麻豆| 亚洲人妻熟妇三十三区| 超碰1997| 91精品91久久久久77777| 久久久久久久久女黄| 9.1小视频| 91精品在线播放| 偷拍视频青青草在线视频| 中文字幕一二三| 欧差乱伦二三| 日韩一级特黄av毛片| 欧美系列在线一区二区| 久久九九综合| 欧美老熟另类| 99精品丰满人妻无码| 欧美图片校园春色| 国内亚洲高清无码| 中文字幕91页| 伊色综合天堂色97| 欧美亚洲美少妇一区二区| 久久久久国产| 夜夜欢天天干| 精品久久无码午夜福利| 在线性黄高清免费视频| 超碰在线国产| 亚州综合AⅤ| 麻豆一区二区AV天美| 欧美日韩在线视频网站| 人人摸人人叼| 麻豆影音天美视频| 亚洲情色 欧美| 性爱综合网| AA丁香综合激情| 欧美人体性爱互联网第一页婷婷日本| 欧美性爱精品七区| 色综合尤物| 在线视频五十市| 东京热,男人的天堂| 91露脸熟女专区| 婷婷五月天激情网| 亚av顶级裸体一区二区三区四区五区 | 婷婷另类小说| 亚洲中文字幕熟女| 激情五月综合| 夜夜做夜夜爽精品视频| 999精品国产高清一区二区| 五月天久久久| 亚洲人精品久久久| 日韩无码三级影院| 日韩内射视频| 黄骗免费网站| 久久小视频| 干b网| 人人摸人人叼| 亚欧美综合网。| 高清无码在线播放网站| 日本女厕偷拍| 91视频伊人| 日韩欧美大力操| 东北女人av| 亚洲资源站| 香蕉综合网| 一二三四区电影| 国产精品一区二区手机看片| 五月香婷婷| 超碰色97| 人人喜人人妻| 日韩综合无码一区久久92| 成人激情无码在线视频| 91大学精品激情戏| 中文久久久| 97色在线观看| 中文字幕一区二区三区高清| 婷婷色综合| 天天爽夜夜欢视| 久久久久国产精品久久久| 久久一二三四五六七八九区区区 | 26uuu国产成人综合| 亚州日韩97| 97人妻免费中文字幕| 亚洲清纯唯美| aaa一级黄片| 99999亚洲| 亚洲不卡不卡中文字幕不卡| 波多野结衣之双飞调教在线播放| 中文字幕在线观看第二页| www.99色| 四虎免费在线播放| 97久久久久久久精| 人人操人人插人人摸人人干| 久久久96精品| 欧美|91色综合| 日本幼女18+| 亚洲欧美爆| 国语精品内射在线观看| 97国产精选| 2025亚洲男人天堂| 久久久久久精品免费看A级| 久草电影网| 闷骚老熟女15P| 五月婷婷丁香中文字幕| 精品九九九| 97超碰中文字幕| 99少妇精品视频| 欧美成人四级在线播放| 国产传媒日韩| 一二三四区电影| 精品久久久久黄少妇| 国产成人无码网站在线视频| 偷拍偷窥与盗摄视频专区| 人妻无码一区二区三区久久99| 九色视频91| 亚洲欧美日韩免费电影| 97在线观看视频| 99re99视频在线免费观看| 碰碰在线视频| 亚洲日韩肥臀视频在线观看| 亚洲人人夜夜澡人人爽| 欧美久久毛片基地| 男人亚洲91首页在线| 欧美性爱伊人| 9久在线视频只有精品| 91综合天天| 91劲爆| 熟妇人妻一区二区三在线| 理论久久婷婷网 8| 狠狠狠狠狠| 午夜福利成人免费视频| 精品中文字幕一区二区l - 百度| 福利社区午夜一区二区| 国产兽交视频在线播放| 中日韩免费看男女操逼大全| 秋霞怕怕片| 综合网亚洲| 少妇久久| 日韩成人私密一级精品av| 色图综合网| 亚洲综合首页| 天天做天天爱夜夜爽毛片试看| 成人三级片一区二区三区视频| 亚洲综合伊人| 天天色综合影视网| 人妻熟女一区二区在线视频| 亚洲国产综合图区中文字幕| 91老女人| 黄片国产精品一区二区| 日韩乱伦影音先锋| 亚洲AV永久无码一区仙野| 国产色精品午夜大片| 在线看片国产精品每日更新| 国语精品内射在线观看| 99久久婷婷国产综合| 天天天天操| 人妻少妇视频在线播放| 日韩av熟女一区二区三区成人| 亚洲情色1区| 精品小视频在线| 激情综合网一盗摄| 久久久女人| 蜜臀一区二区三区在线| 久操com| 秋霞蝌科网日本一区| 一级免费啪啪片| 后入 亚洲 美女 射| 99re6久热只有精品6在线直播 | 亚洲最大无码中文字幕网站| 五月丁香色综合| 3571色综合一区二区二区| 成人无码专区精品视频| 校园春色家庭伦理欧美激情| 易易A毛视频| 国产精品区在线12p| 日本福利二区视频| 久久97资源 网| 日本高清一本二本免费不卡| 色噜噜综合网| 久久久久久久久久久久九| 国产精品久久久久久久久久久久久久吹| 欧美特大AA级黄片| 天天干,天天日| 天堂资源站| 欧美日韩中文字幕人妻| 老司机老司机午夜影院| 婷婷伊人一区| 超碰99在线| 亚洲国产一区二区入口| 天美av在线观看| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 亚州,欧美在线| 五月婷网站| 男人的天堂在线2| 久九色| 婷婷久久久| 亚洲玖玖爱| 日本一区二区成人在线| 亚洲成人妻日韩在线| 日韩免费高清大片在线| 狼人综合婷婷激情四射 | 加勒比海色香蕉婷婷| 人妻熟女午夜精品在线| 色97欧美| 亚洲综合小说另类图欧美视频激情小说色五月天 | 欧美高清第一页| renqi久久久久久久久久久久| 毛片99-全集电影手机免费观看完整-B029AV| 97chaopengongkai| 风月影院十八禁| 天天搞在线综合网| 射丝袜大香蕉| 91干熟女| 免费视频一二三区| 99热这里只有精| 岛国免费视频在线| 农村妇女精品一区二区| 免费作爱一级视频| 怡红院久久老司机| 99色悠悠| 久操凹凸视频| 人妻熟妇一区二区三区| av天堂影视中文在字幕在线中文 | 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 劲爆欧美人妖三区91| 欧美精品久久久久久久久88| 久久99九九九九6666免费观看软件| 人妻AV 中文字幕的| 亚洲无线观看久久| 婷婷15月天青娱乐| 五月天色色色| 无码久久亚洲高清,| 欧美影音在线| 日韩欧美视频青青| 国产无码高清操逼视频| 骚鸭AV| 北条麻妃99精品青青久久| 一区二区中文| 亚洲91射| 欧美一区二区三区大综合| 欧美大香蕉专区网| 91操熟女| 欧美成人精品一区二区男人蜜臀| JULIA人妻风俗店中出电影| 中文字幕亚洲永久精品| 精品少妇999| 日本中文字幕一区| 日韩在线视频1234| 激情久久av一区av二区av| 免费精品无码一级毛片牛牛影视| 9997se| 96AV久久久| 九九无码| 强奸乱伦av电影| 人人操人人色人人摸| 久久在肏| 青青草好吊| 日韩啪啪啪视频| 久久精品一区二区三区不卡| 日韩精品一区二区高清| 久久超碰大香蕉| 91欧美长吊| 精品999日本| 大香蕉久| 天天爽人人综合免费7799| 四虎影视永久在线免费| 国产日韩精品无码去免费专区国产| 97亚洲在线| 性色A∨91| 色婷婷一区二区三区久久| 国产精品日日摸天天碰| 亚洲资源一区| 96麻豆精品一区二区三区| 中日韩久久久免费看| 91天天美女| 久久久九九| K8久久久久| 少妇熟女视频一二三区| 素人伊尹大香蕉免费下载视频| 智利AV在线网| 日本在线15p| 性欧美999| 性色亚洲| 影音先锋少妇| 久久‘黄片视频| 六十路日本| 久久夜夜夜夜| 97色操| 长久操视频| 婷婷五月天基地| 久久黄片国产一区二区| 丰满欧美放荡少妇在线| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 91高跟美女在线播放| 日韩中文字幕在线视频观看| 99久久无码| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | oumeisetu综合| 强奸乱伦Av网| 岛国爱情动作片在国产AV无码专区亚洲AV漫画| 伦在线97| 91精品电影18| 久久久久9999| 一级黄色性爱A级片| 欧美极品| 精品人妻一区二区三区四区| 青青草乱入乱欲视频在线观看| 五月丁香啪啪啪| av日韩国产一区二区| 亚洲影院成人| 亚洲成成熟女人综合一区二区| 欧美午夜视频| 亚洲免费日韩在线一区二区| 午夜精品久久久久久久男人的天堂| 干干干天天| 欧美自拍偷拍综合图片| 国产午夜精品在线观看| 熟妇人妻精品一区二区| 人人九九精| 精品人妻一区春色| 久久久久亚洲精品| 尤物av网站| 亚洲第一页色| 91黑丝露脚| 综合一区中亚洲国产成人综合精品| 国产精品成人无码a v毛片| 强奸乱伦 亚洲一区| 97操| 国产操逼网站亚洲一级黄色| 天天噜| 91久久青青草原精品| 日本加勒比无码专区| 日韩欧美麻豆 | 欧美99| 色综合五月天| 999在线电影香蕉| 先锋精品av色鲁| 日韩免费人妻色情网站| 97天天爽| 久久嫩草国产成人一区| 91国产大片| 97AV在线免费观看| 手机在线免费看的av| 99久久婷婷国产综合| 丰满人妻一区二区三区免费| 91热热色| 91春色| 黄色片A级一区二区三区| 狠狠色噜噜狠狠狠狠2018| 人人玩人人添人人澡免费| av无线看| 人妻熟女av国产网站| 色婷婷狠狠18禁| 亚洲日韩肥臀视频在线观看| 玖玖综合色| 999 久久久| 色噜噜人妻av中文字幕| 超碰97人妻| 免费1级a做爰片观看| 国产精品久久久久久片| 天天插天天插| 91高跟美女在线播放| 欧美综合狠| 亚洲成人贴图| 人人操人人操人人操人人操人人操人人人11.CM | 国产亚洲精品玖玖玖在线观看| 综合色色婷婷| 亚洲av总站| 懂色影视久久| 免费操逼91| 人妻中文字幕日韩电影| 天天看综合网| 亚洲欧美综合网站| 国产v亚洲v日韩v欧美v片另类| 亚洲制服aⅴ中文字幕| www.婷婷五月天| 精品国产乱码久久久兰草影视| 极品出轨视频网站| 亚洲成人性爱网站在线播放| 丁香五月天堂| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 67914在线兔费成人视频| 2025年A片视频精品| 操美女高潮抽搐白浆| 中文字幕亚洲欧美在线不卡| 亚洲资源吧| 变态乱伦伪娘灌肠一区二区| 天美国产精品| 999久久芭蕾| 草草影院日本第一页| 91xingse| 久久东京热久久| 91精品伊人久久久大香线蕉91| 宗合情欲网| 久久久久久久久久9| 午夜久久无码1000合集| 欧美白嫩女HD| 国产精品午夜AV完会免费| 爱做久久久久久| 涩涩久久精品| 久久免费99精品久久久久久| 91N欧美| 美女91在线| 色色色99| 超碰97极品9| 亚洲欧洲国产综合av| 99精品人人爽| 一线黄色免费性爱片| 色狠人在线99| 日韩操p| 欧美综合色站| 丁香五六月啪啪| 蜜桃久久久久久久| 黑人娇小av在线播放| 91 刺激在线| 亚洲色人阁| 欧美熟女少妇| 91亚洲网| 色第一页| 最新国内自拍av免费| 青青草色情网站视频| 亚洲国产91精品一区二区久久| 欧美色图中文字幕| AA级电影三区| 中亚黄色三级大片| 日本高清一区二区在线| 九九久精品| 综合久久99| 国产精品久久久| 久草资源在线视频官方总站日韩丝袜美腿 | 99老司机精品视频在线观看| 99热这里只有是精品10| 天天日天天舔天天喷天天射| 国产一区二区三区白丝| 婷婷丁香五月天综合东京热| 超碰欧美97资源| 1024人妻| 操逼操逼操| 媚薬在线视频麻豆| 无码人妻丰满热妇又大又粗| 亚洲图片欧美色图| 亚洲无码99| JIZZJIZZ亚洲女人被躁| 亚洲人妖网| 亚洲精品中文字幕一区在线视频| 精品人妻一区二区三区视频在线| 蜜桃久久综合视频| 岛国色情视频在线观看| 久久久三区二区一区| 91九久| 日本天天操| 久久中文字幕在线观看| 亚洲高清内射| 亚洲精品三| 亚洲黄色视频在线观看视频| 日韩丨制服丨中文|在线| 五月天色图影视| 亚洲乱伦图片视频| 9丨久久九九九| 青青伊人加勒比海| 91色碰| 色欲日韩欧美在线一区| 色吧5亚洲| 日本道人妻久久久在线不卡色视频| 91狠狠综合久久久久久| 欧美人人AAA| 黄色人人| 91在线视频国产网站| 日韩丨制服丨中文|在线| 夜夜爽妓女| 国产激情综合五月久久| 操逼天美3区| 青娱乐淫乱1314| 久久久久久久久久久久色网| 大香蕉啪啪啪啪在线| 大香蕉在线视频15| 99超级碰免费视频| 久久久久亚洲Aⅴ无码| 精品欧美不卡在线播放| 嗯嗯啊啊啊好爽| 午夜AV污污污| 操逼999| 午夜精品久久久99| 91色碰| 伊人亚洲国产一成人久久精品,久久| 日本人人操人人操| 中文字幕亚洲永久精品| 7777奇米影视久久| 91性高朝久久久久久久久| 亚洲情色综合| 三级色影综合网| 九九九久久久W精品| 欧美色吧综合| 美女天天干| 亚洲熟妇白浆无码AV| 麻豆黄站| 九九人妻| 死我十八禁| 嗯~啊~轻一点 视频| 国产精品色约约| 亚欧美无遮挡| 久久有码视频| 97干在线视频| 夜夜精品视频| 啪啪视频免费在线观看| 五月亭亭六月丁香| 国产美女在线精品免费看| 12一15性XXXX粉嫩国产| 国产精品白领在线观看| 九九九精品成人免费视频小说| 国产强奸乱伦无码视频| 麻豆国产精品午夜视频| 久久黄片国产一区二区| 岛国网址国产 | 美欧老女人97| 亚洲诱惑天堂 | av强奸乱轮| 日本道久久综合色色| 欧美99热| 亚洲色图激情小说| 久久亚洲不卡一区二区三区 | 国产精品成人久久一区二区三区 | 亚洲欧美综合网站| 97久久久久| 男女啪啪网站免费视频| 久久五十路熟女人妻| 国产 丝袜 欧美中文 另类| 五月色综合| 日韩av色图综合| 999久久芭蕾| 一级一性爱免费视频| 无码精品久久久天天影视| 欧美在线观看综合国产| 人妻夜夜爽天天爽麻豆三区网站| 亚洲欧洲色情高清| 亚洲一区二区中文字幕| 精品三级在线专区| 3p国产欧美99热| 超碰97欧美在线| 天天操天天日天天干| 九九亚洲| 国产精品久久久久久 百度| 亚洲另类综合欧美| 国外91| 色网站导航大全| 国产超碰| 18岁禁 茉莉成人久久| 日本熟妇熟色97一本在线观看| 色噜噜国产精品视频一区二区| 怡春院久久| 啪啪啪东京| 粉嫩国产精品久久粉嫩| 亚洲色图第四色| 国内精品久久人妻性色av| 先锋精品av色鲁| 无码二级三级| 人人爱人人乐人人操| 九九RE视频在线精品| 龙兴卡官方查询| 黄片qw| 久久久久久久一级黄色打同平台| 97在线播放| 性色av网站| 神马影院午夜福利久久久| 亚洲中文字幕熟女| 尹人大香蕉视频在线| 91久热| 亚洲九月丁香| 蜜臀av网址| 伊人激情五月天一区二区| 久久av网| 国产精品高清2021在线| 国产青一二三| 91综合网| 九月丁香婷婷| 久久专区| 久久超碰日韩精品| 久久婷婷伊人| 色色97爱| A久久| 97免费视频在线| 熟女丰满人妻一区| 少妇被c 黄 免费观看| 丁香五月天婷婷姐| 秋霞Av理论一级在线| sss视频华人在线| 日韩三级在线观看网站| 日han少妇无码| 一级片在线观看高清无码| 97在线青| 国产高清无码一区二区三区四区皇冠| 死我十八禁| 婷婷综合网| 精品一区二区三区麻豆| 99久久com免费视频′| 自拍偷拍 日韩欧美| 亚洲成人精品久久久| 性色av蜜臀av色欲aV| 一摸二插三插| 夜夜爽爽爽| 色综合av综合久久| 亚洲吊色| 很很热性爱视频| 97欧美精品| 东北女人操比视频| 亚洲欧洲综合视频在线| 大学生美女口爆| 麻豆精品天美| 日本一级黄色电影| 欧美gv在线观看| 操老熟女AV| 亚洲性综合9| 欧美极品性爱天天射| 国产精品不卡少妇白| 亚州色站 日韩电影| 色噜噜人妻丝袜a∨先锋影| 999精品久久久久久久| 中文字幕人乱码中文字的预防方法 | 日本一片一区| 4399成人黄A片| heyZO天然素人无码AⅤ专区| 欧美第五页| 97 超碰 人人做 人人爱| 天天色综合天天操| 伊人网免费视频| 香港久久久| 精品九九九九九九九九九| 亚州精人品大香蕉| 男男H黄动漫啪啪无遮挡网站| 秋霞怕怕片| 婷婷人妻激情| 少妇第一页| 天天亚洲综合| 婷婷九月色| 日本激情免费大片| 国产精品一区二区亚洲人成毛片| 婷婷20月天青娱乐| 精品中文日韩字幕视频| a男人的天堂| 九九色色| JULIA一区二区三区在线播放| 欧美国产欧美在线观看| 97视频在线| 色淫网站优优视频| 尤物视频新赏网鲜网色诱网| 97一区二压| 大香蕉99热| 精品久久久久瑟瑟| 最新AVzaixian| 国产精品一二三区福利| 国产精品青草综合久久| 香蕉人人操tv| 高清无码 国产精品| 一本久道在线综合视频| 欧美18 在线观看| 啪啪性爱免费视频| 91肉片| 天天干人人看综合| 东北毛片| 久久精品国产亚洲5555| 欧美色涩| 久久久久97| 久久精品国产亚洲5555| 一级性爱网| 黄片视频观看| 秋霞一集毛片观看| 岛国在线国产| 26uuu性| 国产区性爱在线视频秋霞豆| 精品一区二区综合熟妇| 人妻精品一区二区在线| 免费a在线播放v| 成人精品在线| 蜜臀久久99精品久久久久久久久| 亚洲情色电影网| 96AV久久久| 亚州 综合 色图| 91美女视频电影| 久久内射| 国产精品白领在线观看| 中文人妻av高清一区| 老熟女乱子伦中文字幕一区二区| 日韩欧美中文| 一区二区 韩日AV| 极品粉嫩一区二区| 丝袜美女诱惑 91 视频| 97色欧洲| 大香蕉一级黄色片久久| 搞中出久久| 日本福利二区视频| 亚洲国产一区二区三区在线| 撸撸成人在线视频| 少妇高潮九九九九九九九| 欧美综合自拍| 无码精品蜜桃一区二区三区ww| 91啪啪| silk lablo在线观看一区二区| 亚洲国产麻豆一区二区三区| 天天欧美| 伊人网高清| 午夜男女爽爽爽影院视频| a男人的天堂久久一级A毛片| 无码av永久免费专区网站| 亚洲国产精品9999在线观看| 成人av在线播放| 久久久亚洲Av| 精品人妻1区| 日本高清有码网址视频| 激情综合五月丁香| 麻豆视频test| 97久久国产亚洲精品超碰热| 欧美色图亚洲激情| A 天堂在线观看视频| 国产精选三级在线观看| 亚洲欧洲视频小说在线观看| 99福利社| 久久久久久久伊人精品| 91丨九色丨大屁股| 久草精品视频| 亚洲一区二区三区春色| 91精品国产高清久久久久久,亚洲成人| 精品91摸| 高清视频一区| 在线人人人人人人精品超 | 91欧美色| 精品国产一级久久| 天天看高清麻豆| 国产精品一二三区18| 五月丁香啪啪啪| 亚洲在线观看| 乱伦日本色图AⅤ| 大香网伊人久久综合网eew| 精品视频一区二区| 麻豆国产尤物AV| 欲色综合| 91Chinese在线| 嫩草 我啊~嗯~在线| 草草影院日本第一页| 天天天乱色综合全| 人人操 欧美| 91精品人妻一区二区三区蜜桃臀| 97爱亚洲| 人妻少妇视频在线播放| 校园春色亚洲色图| 亚洲色久| 人妻丝袜一区二区三区在线| 五月丁香激情综合网| 亚洲人精品久久久| 一级性爱aaaa| 超碰天天去日穴| 色五月大香蕉| 精品人妻一区二区三区四区| 夜夜草网站| 亚洲欧美清纯| 日本特黄f c2| 国内毛片欧美香蕉精品| 久久久久久性爱视频| AA级电影三区| 9999九九九久久久| 中国一区二区亚洲人妻| 天天操天天干美女网址导航| 日韩成人网址| 国产精品片| 97免费免费视频网| 波多野结衣先锋影音| 2003天天干夜夜操| 久久久婷| 亚洲一区二区在线观看91| 久插不卡| 青娱乐久久艹| 香蕉99秘 一区精品蜜桃臀| 97干com| 国产不良强奸视频免费看| julia中文字幕在线观看| 国产精品青草综合久久| 外站AV在线| 久久久专区| 婷婷久久五月天| 操操操五月天婷婷丁香影院| 91色综合色| 欧美制服另类丝袜| 亚洲囯产精品女人久久久| 国内毛片四区| 欧美中文字幕一区| 偷窥自拍亚洲天堂网爆| 家庭乱伦麻豆| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 丰满少妇人妻久久久久久| 99久久婷婷丁香| 啊啊啊想要| www.acm成人黄色毛片| 1956日韩精品| 国产成人精品日本视频| 久久专区| 久久风骚城市| 中文字幕十五区| 91在线页| 国产精品自在自拍视频| 日本黄色精品专区网站| 欧美高清91| 婷婷五月天无码 | 狠狠躁日日躁夜夜躁A| 男人天堂2012| 91精品无码人妻系列| 亚洲人体视频在线观看| 成人国产二区三区在线,男女精品。| 歐美性天天| 久久9久9久99久9久9| 婷婷丁香成人| 日韩A优精品在线观看| 国产主播福利| 欧美日韩在线小说| 欧美热图99| 亚洲人精品久久久| 日韩精品国模| 69久久久久久久久久久久久| 韩国轻伦国内自拍一区| 黄色AV影视| 99热这里只有精品地址| 日韩性爱视频在线免费观看| 大香蕉九九| 91暧暧| 国产成人资源| 五月天婷婷欧美三区| 激情小说五月天| 激情五月天婷婷| 九九成人| 超碰97精品在线| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 亚洲丝袜二区| 天天影视网综合少妇| 亚洲精品男人的天堂| 狠狠穞A片一區二區三區| 丁香五月天激情网站| 男人的天堂一区三区| 91性高潮久久久久久久久| 亚洲婷婷五月天| 免费视频在线观看啊啊啊啊啊| 狠狠躁AV| 超碰天天操| 一级免费精品| 啪啪啪男女亚洲中文字幕99| 中文字幕三四五区| 大香蕉伊人75|