前面已经学习了Vuforia插件导入和识别场景的搭建
一、项目概述
本文将详细介绍一个基于Vuforia的AR应用开发全过程,该应用能够实现3D物体扫描、UI交互提示、星球模型生成以及3D信息展示等功能。以下是完整的技术实现路线。
1 环境配置
首先确保已安装以下组件:
-
Unity Hub + Unity 2021.3.x LTS版本
-
Vuforia Engine AR 9.8.x
-
TextMeshPro (Unity标准包)
2.项目功能清单:
本案例实现的功能清单内容:
1.扫描成功后会弹出一个UI文字提示框“恭喜你扫描成功”
2.扫描完毕以后弹出按钮(包含三个星球),点击按钮就会克隆对应星球到指定位置,
3.用手点击这些模型,模型会放大并且手离开就会复原
4.点击这些模型,会弹出3D 介绍的ui信息 面板
3.绘制UI原型图
担任UI交互设计师的角色根据功能为自己绘制原型图:
二、开发步骤
实现步骤:
2.1 创建UI界面
(首页、主页面、交互页面以及所有的提示框信息面板)提前做好,命名最起码让程序看的懂,避免写代码的时间还没有找UI的时间长...........
2.3 游戏初始化脚本
功能实现逻辑:
1. 获取AR摄像机对应的游戏对象
2. 将其设置为非激活状态
作用:游戏启动时默认禁用AR摄像头,需要点击开始扫描按钮主动开启
2.4 点击开始扫描按钮跳转界面和打开摄像机
实现打开ARcamera以及首页UI和MianpageUI的跳转
功能逻辑A:
/// 1.检测摄像机当前状态
/// 2.如果未激活则开启AR摄像机
/// 3.如果已激活则提示警告
// 功能逻辑B:
/// 1.关闭初始界面(含LOGO/按钮)
/// 2.显示扫描模式界面(含扫描提示/多边形等)
场景搭建
下面式全部UI控制以及点击图标克隆地球的脚本
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
-
- public class GameiniUImanager : MonoBehaviour
- {
- float Currentime;
- //1.初始化 (第一个页面打开其他关闭、摄像机关闭)
- //2.点击按钮进入第二个页面、打开摄像机
- [Header("请填入你的AR摄像机")]
- public GameObject Arcamera;
- //----------------------------
- [Header("请把对应的UI物体放进去")]
- public GameObject FirstPage;
- public GameObject SecondPage;
- public GameObject ThirdPage;
- public GameObject Tip01Page;
- public GameObject Tip02Page;
- public GameObject AlwaysDisPage;
-
- public GameObject EARTHoBJ;
-
- private void Start()
- {
-
- Arcamera.SetActive(false);//关闭摄像机
- FirstPage.SetActive(true);//打开第一个页面
- SecondPage.SetActive(false);//关闭页面
- ThirdPage.SetActive(false);//关闭页面
- Tip01Page.SetActive(false);//关闭页面
- AlwaysDisPage.SetActive(false);//关闭页面
- Tip02Page.SetActive(false);
- }
-
- public void FirstPageTurn()
- {
- Debug.Log("用户点击第一个页面关闭,打开第二个页面,摄像机打开");
- FirstPage.SetActive(false);//第一个页面
- SecondPage.SetActive(true);//关闭页面
- Arcamera.SetActive(true);//关闭摄像机
- }
- public void Tip01Open()
- {
- Tip01Page.SetActive(true);//打开
- Currentime = Time.time;
- AlwaysDisPage.SetActive(true);//关闭页面
- }
-
- public void OpenThirdpage()
- {
- SecondPage.SetActive(false);//关闭页面
- ThirdPage.SetActive(true);//关闭页面
- //提示框,请选择星球放
-
- }
-
- public void clonearth()
- {
- //用户点击了地球图标!开始克隆一个地球!
- GameObject tempOBJ= GameObject.Instantiate(EARTHoBJ, new Vector3(0, 0.1f, 0), Quaternion.identity);
- tempOBJ.AddComponent
(); -
-
- }
-
-
- private void Update()
- {
- if (Time.time - Displaytime > 1.5f && Tip01Page.activeSelf)
- {
- Tip01Page.SetActive(false);//扫描成功的提示框
- Debug.Log("自动关闭提示框");
- ThirdPage.SetActive(true);//第三个页面
- }
- }
-
-
-
- }
代码功能总结
-
初始化功能:
- 在游戏开始时关闭AR摄像机
- 只显示第一个UI页面,其他所有页面都处于关闭状态
-
页面切换功能:
FirstPageTurn()
: 从第一个页面切换到第二个页面,并激活AR摄像机OpenThirdpage()
: 从第二个页面切换到第三个页面
-
提示功能:
Tip01Open()
: 打开提示页面01并开始计时- 在Update()中自动检测提示页面01的显示时间,超过3秒后自动关闭
-
AR对象功能:
clonearth()
: 在场景中实例化地球对象
-
调试功能:
- 在Update()中输出当前时间,方便调试
这个脚本主要实现鼠标放在物体上,会缩放物体,以及点击物体克隆UI面板!
要想侦听三维世界的物体,还需要2个东西!
1.摄像机需要添加Physic Raycast组件!
2.场景中需要EventSystem 游戏物体
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.EventSystems;
-
- public class Raycast : MonoBehaviour, IPointerClickHandler, IPointerExitHandler, IPointerEnterHandler, IDragHandler
- {
- Vector3 tempscale;
- Object UITipmuban;
- //public GameObject UIfarther;
-
-
- void Start()
- {
- tempscale = this.transform.localScale;
- GameObject.FindWithTag("UImuban");
- UITipmuban= Resources.Load("Earth");
- // Vector3 temppos= Camera.main.ScreenToWorldPoint(Input.mousePosition);
- }
-
-
- public void OnPointerClick(PointerEventData eventData)
- {
- Debug.Log("点击了物体");
- GameObject.Instantiate(UITipmuban, new Vector3(0, 2f, 0), Quaternion.identity, this.transform);
-
-
-
- }
-
- public void OnPointerExit(PointerEventData eventData)
- {
- this.transform.localScale = tempscale;
-
- }
-
-
-
- public void OnPointerEnter(PointerEventData eventData)
- {
-
- this.transform.localScale *= 1.5f;
-
- }
-
- public void OnDrag(PointerEventData eventData)
- {
- Debug.Log("拖拽了物体" + Camera.main.ScreenToWorldPoint(Input.mousePosition));
-
- this.transform.position = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 2f));
-
- }
-
-
-
- // Start is called before the first frame update
-
- }


评论记录:
回复评论: