輕松打造Unity小游戲AR體驗

目錄

AR會話初始化

平面追蹤與相機定位

用戶交互處理

實時渲染


Unity 小游戲宿主現已支持 AR 功能,本文介紹如何從零開始創建一個可以在Unity小游戲宿主上運行的AR小游戲,歡迎大家試用!

想為你的小游戲注入虛實交融的魔力嗎?現在,Unity 小游戲宿主正式支持 AR 功能,助你輕松打造沉浸式增強現實體驗!


🌟 為什么選擇Unity小游戲宿主?

  • 無縫接入:專為小游戲優化的 AR API,快速集成,省時省力

  • 強大性能:基于成熟技術棧,流暢運行復雜 AR 場景

  • 跨平臺兼容:一次開發,多端部署,觸達億萬玩家

🎮 開發者福音 無論你是想開發:

  • 虛實結合的冒險游戲

  • 場景互動的營銷應用

  • 社交 AR 小游戲 這份文檔將手把手教你如何通過 Unity 宿主 AR API,快速實現AR功能!

📢 現在就開始,讓你的小游戲從屏幕里"跳"出來!


AR API設計原則

本AR API基于微信VisionKit API規范開發,為Unity小游戲開發者提供與微信平臺高度兼容的AR功能支持。我們采用與VisionKit一致的API命名規范,核心功能接口(如平面檢測、圖像追蹤等)保持對齊,并支持微信VisionKit的主要數據結構格式。但需要注意,部分API的輸出與原生VisionKit可能存在細微差異。

開發者可通過tj.createVKSession(option: SessionOption)函數啟動基礎AR功能。返回的VKSession對象可用于運動跟蹤,或獲取AR引擎對圖片、3D物體及平面的識別結果。基于這些識別結果,開發者可實現多種AR應用場景,包括:

  • 圖片增強效果
  • 3D物體特效展示(如在商品周圍呈現廣告)
  • 平面虛擬物品陳列等

接下來,我們將從零開始構建一個AR小游戲。

創建AR小游戲步驟

  1. 定義工具類

首先創建兩個核心工具類:

  • ARCameraTexRenderer:負責相機背景渲染
  • ARSceneRenderer:處理AR內容疊加

基礎類結構如下:

class ARCameraTexRenderer {setup() {// ...// 定義著色器程序,初始化WebGL,適配屏幕比例等}render(frame) {// ...// 將相機捕獲的YUV幀數據通過WebGL渲染到屏幕上}
}class ARSceneRenderer {setup() {// ...// 初始化WebGL渲染器,設置主相機,創建場景并添加光照,創建目標指示器,加載模型}render(frame) {// ...// 根據AR相機更新相機矩陣并渲染場景}
}

受限于篇幅兩個工具類的實現不具體展開,如果感興趣的話可以聯系我們索取demo工程。

2.準備工作

接下來讓我們做一些準備工作,通過tj.createCanvas()方法創建Canvas,并且實例化兩個工具類,為簡化渲染部分代碼我們引入了Three.js依賴用于3D渲染。

this.canvas = tj.createCanvas();
this.THREE = createScopedThreejs(canvas);
this.glContext = this.canvas.getContext("webgl");
this.arSceneRenderer = new ARSceneRenderer(this.canvas, this.THREE);
this.arSceneRenderer.setup();
this.camTexRenderer = new ARCameraTexRenderer(this.glContext);
this.camTexRenderer.setup();

3.創建session用于平面檢測 通過調用tj.createVKSession方法創建AR session。

this.session = tj.createVKSession({track:{plane:true,},version:'v1',gl:this.glContext 
});

我們通過上述代碼實現了支持平面檢測的AR會話。通過設置不同的sessionOption參數,可以擴展更多AR功能。

關于sessionOption的配置說明:

當前基礎版VKSession支持以下三種AR功能:

  1. 標記檢測(支持圖片和模型識別)
  2. 平面檢測
  3. 運動跟蹤

創建VKSession時,系統會根據配置參數生成相應的AR功能實例。需要注意以下事項:

  1. 當前版本暫不支持多跟蹤功能同時啟用
  2. 當TrackOption中配置多個功能時,系統將按照優先級順序啟用最高級別的功能:
    • 運動跟蹤(最高優先級)
    • 平面檢測
    • 標記檢測(最低優先級)

SessionOption參數定義如下:

interface SessionOption{// 為了兼容微信的VisionKit,保留version屬性,但沒有任何功能上的影響。// 可傳入'v1'和'v2'。version:string// 具體的配置屬性,必須傳入。track:TrackOption,// webgl context。必要gl:WebGLRenderingContext
}
// 默認session只提供通用的AR功能,SSM和DSM請使用createSSMSession和createDSMSession創建
// 對應的session。同一時間只能開啟一個AR功能。
interface TrackOption {// 圖片/模型跟蹤功能。開啟之后,同時支持圖片和模型的跟蹤。圖片支持同時跟蹤多個圖片。// 模型支持同時跟蹤一個物體。測試工程:ARMain_Object.jsmarker:MarkersOption,// 是否開啟SurfaceTrack功能。SurfaceTrack能識別平面上最近的anchor點。plane: Bool,// 開啟后創建6Dof的簡單運動跟蹤,適合簡單的AR程序。較為輕量。同時,只有在這個模式下// camera.viewMaterix才會有值,其他模式下,viewMatrix都為單位矩陣motion: Bool,
}

4.啟動會話

最后,通過調用session.start()方法即可啟動AR會話。以下代碼示例展示了核心功能實現,非關鍵代碼已做簡化處理。

AR會話初始化

調用session.start()啟動AR功能,開啟平面檢測(plane detection)功能。

平面追蹤與相機定位

  • addAnchors:當檢測到平面時,設置標記(planeExist = true
  • updateAnchors:實時更新相機位置(通過anchor.transform參數)

用戶交互處理

當用戶點擊屏幕時,通過射線檢測(Raycaster)在已檢測的平面上放置3D模型。

實時渲染

每幀獲取AR相機數據(getVKFrame),同時渲染相機背景和3D場景。

let mainCamera = this.arSceneRenderer.mainCamera;
this.session.start(status => {// 判斷status進行錯誤處理 ...session.on('addAnchors',anchors=>{if(anchors && anchors.length > 0){// 標記檢測到平面planeExist = true;}});session.on('updateAnchors',anchors=>{if(anchors && anchors.length>0){let anchor = anchors[0];// 更新相機mainCamera.matrixWorldInverse.fromArray(anchor.transform);                  mainCamera.matrixWorld.getInverse(mainCamera.matrixWorldInverse);}});let raycaster = new THREE.Raycaster();tj.onTouchStart(function(evt){if(!planeExist){return;} // 未檢測到平面則忽略// 計算點擊位置(歸一化坐標)let pointer = new THREE.Vector2()pointer.x = evt.touches[0].pageX / canvas.width * 2 - 1;pointer.y = - evt.touches[0].pageY / canvas.height * 2 + 1;// 射線檢測raycaster.setFromCamera(pointer,mainCamera);const intersects = raycaster.intersectObjects( arSceneRenderer.scene.children );for(let i of intersects){if(i.object == arSceneRenderer.planeMesh){// 放置目標指示器arSceneRenderer.aimCenter.position.set(i.point.x,i.point.y,i.point.z);// 放置模型if(arSceneRenderer.currentModel){if(arSceneRenderer.putModel){return;}let obj = arSceneRenderer.currentModel;obj.scale.setScalar(0.1);obj.position.set(i.point.x,i.point.y,i.point.z);arSceneRenderer.scene.add(obj);arSceneRenderer.putModel = true;// 模型控制器 ...}}}           })const onUpdate = function(){// 渲染相機背景和3D場景const frame = session.getVKFrame(canvas.width,canvas.height);if(frame && frame.camera){if(camTexRenderer.render(frame)){arSceneRenderer.render(frame);                      }}   session.requestAnimationFrame(onUpdate);}// 啟動渲染session.requestAnimationFrame(onUpdate);
});

5.運行

游戲編碼已完成,現在可以在宿主設備上運行測試。啟動游戲后,請按照以下步驟操作:

  1. 移動手機直至系統成功識別平面,屏幕上將顯示平面坐標軸
  2. 點擊屏幕即可在識別到的平面位置放置3D模型
  3. 移動攝像頭時,模型會固定在已識別的平面位置
  4. 通過觸屏手勢可調整模型的大小和旋轉角度

具體效果如下圖所示:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91208.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91208.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91208.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IFCVF驅動+vhost-vfio提高虛擬機網絡性能

??IFCVF (Intel FPGA Virtual Function)?? 是 Intel 為其基于 FPGA 的智能網卡開發的 ??SR-IOV 虛擬功能驅動??,屬于 ??PF4 (Physical Function 4)?? 架構的一部分。它是專為高性能網絡虛擬化場景設計的硬件加速解決方案。 云計算智能網卡(soc)或DPU場景下,IFC…

Hook捕獲并攔截文件創建行為

需要用到minhook 先編譯DLL #include <Windows.h> #include <string> #include <TlHelp32.h> #include <Shlwapi.h>#include "MinHook.h" // 自動選擇正確的MinHook庫 #pragma comment(lib, "Shlwapi.lib") #if defined(_M_X64) …

圖像平滑處理

圖像平滑處理四種常用方式1. 均值濾波 (cv2.blur())2. 高斯濾波 (cv2.GaussianBlur())3. 中值濾波 (cv2.medianBlur())4、雙邊濾波 (cv2.bilateralFilter())總結存圖時遇到一個中文版亂碼問題四種常用方式 平滑處理&#xff08;也稱為模糊處理&#xff09;&#xff0c;用于減少…

fortigate的waf功能

在系統管理----可見功能----web應用防火墻打開waf功能Web 應用程序防火墻 &#xff08;WAF&#xff09; 配置文件可以檢測和阻止已知的 Web 應用程序攻擊。您可以將 WAF 配置文件配置為使用簽名和約束來檢查 Web 流量。您還可以強制實施 HTTP 方法策略&#xff0c;該策略控制與…

AI Compass前沿速覽:可靈創意工坊、字節Coze StudioCoze Loop、通義萬相2.2 、智譜GLM-4.5、騰訊混元3D世界模型開源

AI Compass前沿速覽&#xff1a;可靈創意工坊、字節Coze Studio&Coze Loop、通義萬相2.2 、智譜GLM-4.5、騰訊混元3D世界模型開源 AI-Compass 致力于構建最全面、最實用、最前沿的AI技術學習和實踐生態&#xff0c;通過六大核心模塊的系統化組織&#xff0c;為不同層次的學…

SpringCloud之Gateway

SpringCloud之Gateway 官網地址&#xff1a; https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories 1. 什么是gateway Spring Cloud Gateway 是Spring Cloud官方推出的第二代網關框架&#xff0c;定位于取代 Net…

關于獲取某目錄及子目錄下所有文件且不包含隱藏文件

最近比較忙&#xff0c;很少寫blog了&#xff01;&#xff01;&#xff01;關于獲取目錄及子目錄下所有文件是常遇到的功能&#xff0c;一般通過遞歸遍歷實現。而生產場景中&#xff0c;一般是遍歷nas上的目錄&#xff0c;在nas上利用File.listFiles(),在linux系統上無法獲取含…

docker可視化管理工具lazydocker

Lazydocker 是一個用 Go 語言編寫的命令行 Docker 管理工具。它提供了一個簡潔、直觀的終端界面&#xff0c;支持鍵盤和鼠標操作&#xff0c;可通過方向鍵與快捷鍵實時查看和管理容器、鏡像、網絡等資源&#xff0c;大幅簡化了原本復雜的命令行操作&#xff0c;提升操作效率。2…

少林寺用什么數據庫?

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中國DBA聯盟(ACDU)成員&#xff0c;15年DBA工作經驗 Oracle、PostgreSQL ACE CSDN博客專家及B站知名UP主&#xff0c;全網粉絲15萬 擅長主流Oracle、MySQL、PG、高斯及…

C語言---萬能指針(void *)、查找子串(strncmp函數的應用)多維數組(一維數組指針、二維數組指針)、返回指針值函數、關鍵字(const)

一、字符串與指針用字符指針指向一個字符串&#xff0c;可以不定義字符數組&#xff0c;而定義字符指針。用字符指針指向字符串中的字符。不能使用指針去改變不能修改的空間。eg1. 運用指針將 src 的內容拷貝到 dest 中去void Strcpy(char *dest, char *src) {while(*src ! \0)…

Keepalived 實戰

一、高可用集群基礎核心概念與指標集群類型&#xff1a;LB&#xff08;負載均衡&#xff09;&#xff1a;如 LVS、HAProxy、Nginx&#xff0c;提升吞吐量&#xff1b;HA&#xff08;高可用&#xff09;&#xff1a;保障核心服務&#xff08;數據庫、Redis&#xff09;連續性&am…

窗口函數替代子查詢的復雜查詢簡化技巧

窗口函數通過單次掃描完成分析計算&#xff0c;能大幅簡化子查詢結構并提升性能&#xff0c;尤其在排名、累計計算等場景?15。以下是核心優化技巧&#xff1a;一、排名場景替代方案?部門工資排名?傳統子查詢需自連接和聚合計數&#xff1a;sqlSELECT e1.name, e1.salary, (S…

深度學習:預訓練和warm up的區別

“預訓練&#xff08;Pre-training&#xff09;”和“Warm-up&#xff08;預熱&#xff09;”是深度學習中常見的兩個訓練策略&#xff0c;它們雖然都在訓練初期起作用&#xff0c;但本質和目的完全不同。一、預訓練&#xff08;Pre-training&#xff09;1. 定義預訓練是指&…

Apache Ignite中分布式信號量(Distributed Semaphore)的說明和使用示例

這段內容是關于 Apache Ignite 中 分布式信號量&#xff08;Distributed Semaphore&#xff09; 的說明和使用示例。我們來一步步解析&#xff0c;幫助你深入理解它的含義和用途。&#x1f539; 一、什么是 Semaphore&#xff08;信號量&#xff09;&#xff1f; 在并發編程中&…

怎么提升服務器的防攻擊能力!

提升服務器的防攻擊能力需要從??架構設計、技術防護、運維管理??等多維度入手&#xff0c;覆蓋網絡層、系統層、應用層及數據層的安全防護。以下是具體的策略和實踐方法&#xff1a;??一、基礎安全加固&#xff1a;消除自身漏洞??服務器自身的脆弱性是最常見的攻擊入口…

vscode配置rust環境

1.官網下載vscode&#xff0c;安裝 2.vscode命令行運行&#xff1a; Invoke-WebRequest https://win.rustup.rs/x86_64 -OutFile rustup-init.exe然后&#xff1a; .\rustup-init.exe3.驗證 先配置path&#xff1a; $env:Path ";$env:USERPROFILE\.cargo\bin"查看是…

最新版 HarmonyOS NEXT 開發工具安裝教程:如何在 macOS 系統安裝 DevEco Studio 5.0.3 編輯器?

最新版 HarmonyOS NEXT 開發工具安裝教程&#xff1a;如何在 macOS 系統安裝 DevEco Studio 5.0.3 編輯器&#xff1f; 什么是 DevEco Studio&#xff1f; DevEco Studio 是華為為 HarmonyOS 開發的強大集成開發環境&#xff08;IDE&#xff09;&#xff0c;專為開發 Harmony…

電商項目統一認證方案設計與實戰

1. 微服務網關整合 OAuth2.0 設計思路分析 網關整合 OAuth2.0 有兩種思路&#xff0c;一種是授權服務器生成令牌, 所有請求統一 在網關層驗證&#xff0c;判斷權限等操作&#xff1b;另一種是由各資源服務處理&#xff0c;網關只做請求 轉發 。 比較常用的是第一種&#xf…

學習Markdown

標題一 標題二 標題三 標題四 標題五 標題六這是一段引用文本直接編寫&#xff0c;段落換行是末尾兩個以上的空格&#xff0b;回車 或者在段落后加一個空行 粗體語法&#xff1a;使用兩個星號 ** 或兩個下劃線 __ 包圍文字&#xff1a;這是粗體文字使用星號 這是__粗體文字__使…

劇本殺系統 App 開發:科技賦能,重塑劇本殺游戲體驗

在科技飛速發展的當下&#xff0c;各個行業都在積極尋求與科技的融合&#xff0c;以實現創新和升級。劇本殺行業也不例外&#xff0c;劇本殺系統 App 的開發正是科技賦能的生動體現&#xff0c;它重塑了傳統的劇本殺游戲體驗&#xff0c;為玩家帶來了全新的感受。劇本殺系統 Ap…