找回密码
 立即注册
查看: 202|回复: 0

[简易教程] 使用Unity中的ARFoundation开发AR应用

[复制链接]
发表于 2022-6-12 08:38 | 显示全部楼层 |阅读模式
1 Overview

教程链接:Getting Started With ARFoundation in Unity (ARKit, ARCore)
github链接:GitHub - TheUnityWorkbench/tuw-arfoundation-demo
关于ARFoundation的介绍可以参见大佬的文章:ARFoundation之路-概述__DavidWang_的博客-CSDN博客_arfoundation
2 知识点拆解

2.1 配置ARFoundation

(1)首先在unity中新建一个3D项目;
(2)edit-project settings-Player
1)先设置ios系统的设置
填写bundle identifier、packagename(非必要);
关掉automatically sign:如果只是苹果系统开发,可以开启;
开启Requires ARKit support,只对ios11及以上的系统适用,所以需要修改Target minimum iOS Version到11;
ARchitecture需要修改到ARM64(ARKit仅可应用于ARM64);

2)再设置安卓平台的设置
填写bundle identifier、packagename(非必要);
关闭Multithreaded Rendering,因为和ARCore不适配;
因为ARCore只适配安卓7以上的版本,所以需要修改minimum api level到7.0;

3)加载api
路径:window-package manager
需要的三个api:AR Foundation、ARCore XR Plugin、ARKit XR Plugin
然后我们在Hierarchy中选择新建,就可以看到多了一个叫XR的选项,可以新建AR Session Origin的对象;
AR Session Origin自带一个叫AR Camera的摄像机,这时候就可以删除默认的main camera,然后将AR Camera标记为Main Camera。
至此就可以放置我们的素材了。

tips:需要先调试好发布平台,以方便开发过程中在手机应用看开发的效果
iOS account setup

2.2 简单AR应用的素材要素放置

unity中的一个单位对应着现实世界中的1米,所以在调整对象的尺寸的时候注意不要太大了。
本次教程中主要的游戏对象主要一个3D模型和位置指示标
模型和指示标都可以在github的资源中下载。
其中,指示标需要创建类型为quad的3d对象,然后创建一个material,在material中上传资源中png格式的箭头图片,将这个材质拖动到quad中,quad需要勾选Alpha is transparency。
也可以用同样的方式来制作模型的阴影。
2.3 编写简单的AR应用脚本

链接:https://github.com/TheUnityWorkbench/tuw-arfoundation-demo/blob/master/Assets/Demo/ARTapToPlaceObject.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.Experimental.XR;
using System;

public class ARTapToPlaceObject : MonoBehaviour
{
    public GameObject objectToPlace;
    public GameObject placementIndicator;

    private ARSessionOrigin arOrigin;
    private Pose placementPose;
    private bool placementPoseIsValid = false;

    void Start()
    {
        arOrigin = FindObjectOfType<ARSessionOrigin>();
    }

    void Update()
    {
        UpdatePlacementPose();
        UpdatePlacementIndicator();

        if (placementPoseIsValid && Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
        {
            PlaceObject();
        }
    }

    private void PlaceObject()
    {
        Instantiate(objectToPlace, placementPose.position, placementPose.rotation);
    }

    private void UpdatePlacementIndicator()
    {
        if (placementPoseIsValid)
        {
            placementIndicator.SetActive(true);
            placementIndicator.transform.SetPositionAndRotation(placementPose.position, placementPose.rotation);
        }
        else
        {
            placementIndicator.SetActive(false);
        }
    }

    private void UpdatePlacementPose()
    {
        var screenCenter = Camera.current.ViewportToScreenPoint(new Vector3(0.5f, 0.5f));
        var hits = new List<ARRaycastHit>();
        arOrigin.Raycast(screenCenter, hits, TrackableType.Planes);

        placementPoseIsValid = hits.Count > 0;
        if (placementPoseIsValid)
        {
            placementPose = hits[0].pose;

            var cameraForward = Camera.current.transform.forward;
            var cameraBearing = new Vector3(cameraForward.x, 0, cameraForward.z).normalized;//保持指示标的方向一直向前
            placementPose.rotation = Quaternion.LookRotation(cameraBearing);
        }
    }
}2.4 调整素材的大小精确度

(1)调整阴影的精确度
edit-project settings-quality
可以调整shadow distance、shadow resolution
(2)在transform中调整
利用scale参数来调整。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-9 18:40 , Processed in 0.109001 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表