AR 콘텐츠 기초

[AR Foundation] 다중 마커 인식 방식, GPS 기능 사용하기, Firebase를 이용한 Realtime Database 생성하기

다모아 2023. 11. 8. 13:23

다중 마커 인식 방식

 

 

trackedImagesChanged의 매개변수는 ARTrackedImagesChangedEventArgs다
이렇게 사용하는게 더 좋음, 제거는 -= 임 오타

 

라이브러리 애들 이름을 내가 변경한 프리팹의 이름으로 변경

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

 

이벤트 함수의 실행 순서 - Unity 매뉴얼

Unity 스크립트를 실행하면 사전에 지정한 순서대로 여러 개의 이벤트 함수가 실행됩니다. 이 페이지에서는 이러한 이벤트 함수를 소개하고 실행 시퀀스에 어떻게 포함되는지 설명합니다.

docs.unity3d.com


GPS기능 사용하기

 

빈게임오브젝트 만들고 스크립트 만들고 오브젝트에 스크립트 넣기

text로 위도와 경도 만들어주고 왼쪽 상단에 위치해줬음

 

처음에 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 생성하기

 

https://console.firebase.google.com/?hl=ko&_gl=1*1hukz2s*_ga*MTQ0NDkyOTQ0MC4xNjk5NDE0NjY3*_ga_CW55HF8NVT*MTY5OTQxNDY2Ni4xLjAuMTY5OTQxNDY2Ni42MC4wLjA.&pli=1

 

로그인 - Google 계정

이메일 또는 휴대전화

accounts.google.com

 

MyAR Project 이름으로 만들기

Project Settings - Player

Firebase SDK랑 json 파일 다운로드 받기

 

위치는 미국으로 테스트모드 사용 설정

임포트

주의사항 : 인터넷이 연결된 상태여야함

사용할 리소스가 다 있는게 아니라서 인터넷이 연결된 상태에서 나에게 맞는 dependency들을 받음

YES 2번 누르기
Enable

알아서 버전을 찾아서 설치해줌

ios 모듈이 없어서 에러

 

이걸 삭제하면 해결됌
오류나면 이것도 삭제

해결해도 안되면 아래방법으로 하면됌

YES