iOS에서 제공하는 LiDAR를 활용하여 거리를 측정하기 위해 사용법을 찾던 도중 Unity의 AR Foundation 기능을 이용하면 사용이 가능하다는 것을 알게 되었다. AR Foundation을 사용했던 적이 전무했기에 인터넷과 유튜브를 헤매던 도중 가뭄의 단비같은 Youtube순순스튜디오님의 유튜브를 알게되었으며 강의를 통해 알게된 Raycast에 대한 것을 정리하고자 한다.
(해당 내용은 Raycast를 사용하여 터치한 부분에 공을 두는 것이다.)
먼저 iOS의 LiDAR는 비교적 최근 모델의
- iPhone pro model
- iPad pro model
에서 제공하고있다.
Unity에서 AR 기능을 이용하기 위해 Unity project를 AR로 만들어준다.
그후 아래와 같이 구성된 초반 AR Session Origin의 AR Raycast Manager에 Raycast Prefab의 부분에 Ball prefeb을 추가한다. (LiDAR를 사용하기 위해서는 Raycast Manager가 중요하다.)
Ball prefab의 구성은 3D object의 Sphere를 생성하고 그곳의 Component를 구성해야한다. (터치한 부분에 공을 놓기 위해서 Sphere를 두는 것이다.)
기존의 Default Component에서
Sphere Collider의 Is Trigger를 체크해준다. (체크를 하면 Collider 영역이 있더라도 Collider 영역을 무시해서 중첩할 수 있다.)
이를 통해 생성된 plane에 Ball을 중첩해서 생성할 수 있게된다.
이렇게 생성한 Ball은 Prefab형태로 만들어야 하는데 간단하게 폴더를 생성 후 거기에 Drag and Drop을 하면 된다.
생성된 Prefab을 AR Raycast Manager의 Raycast Prefab에 넣어준다.
그 후 C# Script를 만들고
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
public class SetARBall : MonoBehaviour
{
// 추가한 RaycastManager를 component로 연동
public ARRaycastManager m_RaycastManager;
// 충돌되는 점들을 저장할 list 생성
static List<ARRaycastHit> s_Hits = new List<ARRaycastHit>();
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if(Input.touchCount > 0)
{
Vector2 touchPosition = Input.GetTouch(0).position;
// Raycast에서 touchPosition이 현재 터치한 포인트를, s_Hits가 포인트 저장, .planeWithinPolygon이 생성한 Plane위에 raycast를 생성
if (m_RaycastManager.Raycast(touchPosition, s_Hits, TrackableType.PlaneWithinPolygon))
{
var hitPose = s_Hits[0].pose;
// raycast에 연결되어있는 ratcastPrefab object를 hitPose.position, hitPose.rotation에 맞춰서 생성)
Instantiate(m_RaycastManager.raycastPrefab, hitPose.position, hitPose.rotation);
}
}
}
}
위 코드를 넣은 후
Script를 AR Session Origin을 넣고 사진과 같이 Raycast Manager에 AR Session Origin을 넣음으로 해당 Script가 동작하게 만들면
사진과 같이 터치한 부분에 공을 놓을 수 있다!!! To Be Continued...