|
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参数来调整。 |
|