当前位置: 首页 > news >正文

轻松打造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.dtcms.com/a/305620.html

相关文章:

  • 5,Docker运行最新ultralytics-main教程
  • 解析非法获取计算机信息系统数据罪中的其他技术手段
  • 如何在出售Windows11/10/8/7前彻底清除电脑数据
  • 破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践录
  • Cockpit管理服务器
  • 通达OA服务器无公网IP网络,如何通过内网穿透实现外网远程办公访问OA系统
  • 记录Linux下ping外网失败的问题
  • Docker学习其一
  • 【机器学习】pycharm使用SSH SFTP 远程连接 ubuntu服务器 进行开发+调试+数据训练
  • 在VS2022中调试ASP.NET项目时修改DLL或ASPX动态页面的原理及实现方法
  • 【推荐100个unity插件】Unity 创意编程库——Klak插件的使用
  • 计算机网络基础(二) --- TCP/IP网络结构(应用层)
  • 论文Review LSLAM BALM | 经典激光SLAM方案!港大MARS出品!RAL2021 | 激光BA优化
  • DIV 指令概述
  • AWS VPC NAT 网关可观测最佳实践
  • 【iOS】weak修饰符
  • 计算机组成原理(6) - 加法器
  • SpringBoot学习 |springboot概念+微服务架构
  • 【AI】入门级提示词模板:适用于ChatGPT、文心一言等主流模型
  • day25——HTML CSS 前端开发
  • 运维管理系统的优势和缺点
  • springcloud03-Nacos配置中心
  • HTML应用指南:利用POST请求获取全国公牛门店位置信息
  • Python 使用 asyncio 包处理并 发(使用asyncio包编写服务器)
  • WebSocket 简介与在 Vue 中的使用指南
  • LaTeX 创建工程并生成完整文档指南
  • tplink er2260t配置带vlan的pppoe拨号
  • 【人工智能99问】混合专家模型(MoE)是如何训练的?(18/99)
  • Tomcat 服务器日志
  • uvm-tlm-sockets