다중 마커 인식 방식
라이브러리 애들 이름을 내가 변경한 프리팹의 이름으로 변경
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
public class MultipleImageTracker : MonoBehaviour
{
private ARTrackedImageManager aRTrackedImageManager;
private void Awake()
{
Debug.Log("Awake");
this.aRTrackedImageManager = GetComponent<ARTrackedImageManager>();
Debug.LogFormat("ARTrackedImageManager : {0}", aRTrackedImageManager);
}
// Start is called before the first frame update
private void Start()
{
}
private void OnTrackedImage(ARTrackedImagesChangedEventArgs args)
{
foreach(ARTrackedImage trackedImage in args.added)
{
string imageName = trackedImage.referenceImage.name;
Debug.LogFormat("imageName: {0}", imageName);
//Resources/{imageName}
string path = imageName;
//SerializedField 하는거랑 똑같음
GameObject prefab = Resources.Load<GameObject>(path);
Debug.LogFormat("prefab: {0}", prefab);
//검색된 프리팹이 존재한다면
if (prefab != null)
{
//이미지에 등록된 자식 오브젝트가 없다면
if(trackedImage.transform.childCount < 1)
{
//프리팹의 인스턴스 (복사본)
GameObject go = Instantiate(prefab, trackedImage.transform.position, trackedImage.transform.rotation);
go.transform.SetParent(trackedImage.transform);
}
}
}
//인식중인 이미지들을 모두 순회한다.
foreach(ARTrackedImage trackedImage in args.updated)
{
//이미지에 등록된 자식 오브젝트가 있다면
if(trackedImage.transform.childCount > 0)
{
//자식오브젝트의 위치를 이미지의 위치와 동기화한다
trackedImage.transform.GetChild(0).position = trackedImage.transform.position;
trackedImage.transform.GetChild(0).rotation = trackedImage.transform.rotation;
}
}
}
private void OnEnable()
{
Debug.Log("OnEnable");
//이벤트 핸들러 등록
this.aRTrackedImageManager.trackedImagesChanged += OnTrackedImage;
}
private void OnDisable()
{
Debug.Log("OnDisable");
//이벤트 핸들러 제거
this.aRTrackedImageManager.trackedImagesChanged -= OnTrackedImage;
}
}
https://docs.unity3d.com/kr/2021.2/Manual/ExecutionOrder.html
GPS기능 사용하기
빈게임오브젝트 만들고 스크립트 만들고 오브젝트에 스크립트 넣기
처음에 GPS 사용할 거냐는 문구가 나옴
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.Android;
public class GPSManager : MonoBehaviour
{
[SerializeField] private TMP_Text txtLatitude; //위도
[SerializeField] private TMP_Text txtLongtitude; //경도
//위도, 경도 변수
private float latitude = 0; //위도
private float longitude = 0; //경도
private bool receiveGPS = false;
private float maxWaitTime = 10f; //최대 대기시간 10초
private float waitTime = 0; //현재 대기한 시간
private float resendTime = 1.0f;
// Start is called before the first frame update
void Start()
{
StartCoroutine(GPSOn());
}
private IEnumerator GPSOn()
{
//GPS 허용하지 않았다면
if(!Permission.HasUserAuthorizedPermission(Permission.FineLocation))
{
//GPS 허용 여부를 물어봄
Permission.RequestUserPermission(Permission.FineLocation);
//허락할 때까지 대기
while(!Permission.HasUserAuthorizedPermission(Permission.FineLocation))
{
yield return null;
}
}
//만일 GPS 장치가 켜져있지않으면 위치 정보를 수신할 수 없다고 표시한다.
if(!Input.location.isEnabledByUser)
{
this.txtLatitude.text = "GPS OFF";
this.txtLongtitude.text = "GPS OFF";
yield break;
}
//위치 데이터 요청
Input.location.Start();
//GPS 수신 상태가 초기 상태에서 일정 시간동안 대기
while (Input.location.status == LocationServiceStatus.Initializing && waitTime < maxWaitTime)
{
yield return new WaitForSeconds(1.0f);
waitTime++;
}
//수신 실패
if(Input.location.status == LocationServiceStatus.Failed)
{
txtLatitude.text = "위치 정보 수신 실패";
txtLongtitude.text = "위치 정보 수신 실패";
}
//응답 대기 시간을 초과
if (waitTime > maxWaitTime)
{
txtLatitude.text = "응답 대기시간 초과";
txtLongtitude.text = "응답 대기시간 초과";
}
//수신된 GPS데이터를 화면에 출력한다.
LocationInfo locationInfo = Input.location.lastData;
this.latitude = locationInfo.latitude;
this.longitude = locationInfo.longitude;
txtLatitude.text = string.Format("위도: {0}", latitude);
txtLongtitude.text = string.Format("경도: {0}", longitude);
//위치 정보 수신 시작 체크
receiveGPS = true; //요청에 대한 응답을 받음
//위치 데이터 수신 시작 이후 resendTime 경과마다 위치정보를 갱신하고 출력
while(receiveGPS)
{
yield return new WaitForSeconds(resendTime);
//정보를 다시 받아와서 변수에 넣고 UI에 출력
this.latitude = locationInfo.latitude;
this.longitude = locationInfo.longitude;
txtLatitude.text = string.Format("위도: {0}", latitude);
txtLongtitude.text = string.Format("경도: {0}", longitude);
}
}
}
Firebase를 이용한 Realtime Database 생성하기
MyAR Project 이름으로 만들기
Firebase SDK랑 json 파일 다운로드 받기
위치는 미국으로 테스트모드 사용 설정
주의사항 : 인터넷이 연결된 상태여야함
사용할 리소스가 다 있는게 아니라서 인터넷이 연결된 상태에서 나에게 맞는 dependency들을 받음
알아서 버전을 찾아서 설치해줌
해결해도 안되면 아래방법으로 하면됌
'AR 콘텐츠 기초' 카테고리의 다른 글
[AR Foundation] 단일 마커 인식 방식 (0) | 2023.11.06 |
---|---|
[AR Foundation] ARTrackable, ARFace, ARFaceManager, trackingState, tracking (0) | 2023.11.03 |
[AR Foundation] 얼굴 인식 (1) | 2023.11.02 |
[AR Foundation] 자동차 터치 스와이프로 모델링 회전, 스마트폰에서 앱 실행 중에 꺼짐 방지, ScrollView, Content, 자동차 색 변경, 자동차 색 변경 시 위치 안따라오기 (0) | 2023.11.02 |
[AR Foundation] Car(지면 생성 및 지면 클릭 시 차 생성) (1) | 2023.11.01 |