툴/유니티

AR Foundation 트랙킹 실패시 오브젝트 끄기

스튜디오 오버그래픽스 2021. 8. 1. 22:57

https://youtu.be/qIxClnigves

AR 개발을 하면서 이 튜토리얼을 보고 많이 도움이 됐다. 감사합니다.

그런데 몇번씩 똑같이 만들었지만,  뭐가 문제인지 이미지 트랙킹안되는 상황이 되도 오브젝트가 안꺼짐.

댓글에도 똑같이 안되는 사람들이 있었음.

아마 버전차이거나 환경셋팅이 좀 달라진게 있었던게 아닌가 싶음.

일일히 디버그 찍어보면서 어디서 코드가 작동안하나 확인해봤고, 결국 내 환경에서 작동이 되게 수정함

코드 백업

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.XR;

using UnityEngine.XR.ARFoundation;

​

public class ARTrackedImg : MonoBehaviour

{

public float _timer;

public ARTrackedImageManager trackedImageManager;

public List<GameObject> _objectList = new List<GameObject>();

private Dictionary<string,GameObject> _prefabDic = new Dictionary<string, GameObject>();

private List<ARTrackedImage> _trackedImg = new List<ARTrackedImage>();

private List<float> _trackedTimer= new List<float>();

​

void Awake()

{

foreach( GameObject obj in _objectList)

{

string tName = obj.name;

_prefabDic.Add(tName,obj);

}

}

​

void Update()

{

if(_trackedImg.Count > 0 )

{

List<ARTrackedImage> tNumList = new List<ARTrackedImage>();

for(var i = 0 ; i < _trackedImg.Count ; i++)

{

if(_trackedImg[i].trackingState == UnityEngine.XR.ARSubsystems.TrackingState.Limited)

{

if(_trackedTimer[i] > _timer)

{

string name = _trackedImg[i].referenceImage.name;

GameObject tObj = _prefabDic[name];

tObj.SetActive(false);

tNumList.Add(_trackedImg[i]);

}

else

{

_trackedTimer[i] += Time.deltaTime;

}

}

}

​

if(tNumList.Count > 0 )

{

for ( var i = 0 ; i < tNumList.Count ; i++)

{

int num = _trackedImg.IndexOf(tNumList[i]);

_trackedImg.Remove(_trackedImg[num]);

_trackedTimer.Remove(_trackedTimer[num]);

}

}

}

}

​

private void OnEnable()

{

trackedImageManager.trackedImagesChanged += ImageChanged;

}

private void OnDisable()

{

trackedImageManager.trackedImagesChanged -= ImageChanged;

}

​

private void ImageChanged(ARTrackedImagesChangedEventArgs eventArgs)

{

foreach( ARTrackedImage trackedImage in eventArgs.added)

{

if(!_trackedImg.Contains(trackedImage))

{

_trackedImg.Add(trackedImage);

_trackedTimer.Add(0);

}

}

​

foreach( ARTrackedImage trackedImage in eventArgs.updated)

{

if(!_trackedImg.Contains(trackedImage))

{

_trackedImg.Add(trackedImage);

_trackedTimer.Add(0);

}

else

{

int num = _trackedImg.IndexOf(trackedImage);

//추가한 부분 Limited상태가 아닐때 타이머를 0으로 만듬

if (_trackedImg[num].trackingState == UnityEngine.XR.ARSubsystems.TrackingState.Limited)

{

​

}

else

{

_trackedTimer[num] = 0;

}

​

}

UpdateImage(trackedImage);

}

}

​

private void UpdateImage(ARTrackedImage trackedImage)

{

int num = _trackedImg.IndexOf(trackedImage);

​

string name = trackedImage.referenceImage.name;

GameObject tObj = _prefabDic[name];

//추가한 부분 Limited상태가 아닐때(트랙킹중이 아닐때), 셋액티브true와 위치 동기화를 하지 않음

if (_trackedImg[num].trackingState == UnityEngine.XR.ARSubsystems.TrackingState.Limited)

{

​

}

else

{

tObj.transform.position = trackedImage.transform.position;

tObj.transform.rotation = trackedImage.transform.rotation;

tObj.SetActive(true);

}

​

}

}

수정할 당시엔 이해했는데 이제와서 기록할라니까 뭐에서 작동을 안했고, 이게 왜 해결돼서 작동됐는지 기억은 안나네. 암튼 일단 기록

작동은 하니까