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);
}
}
}
수정할 당시엔 이해했는데 이제와서 기록할라니까 뭐에서 작동을 안했고, 이게 왜 해결돼서 작동됐는지 기억은 안나네. 암튼 일단 기록
작동은 하니까
'툴 > 유니티' 카테고리의 다른 글
[C#] 유니티 렌더텍스쳐 이미지로 저장 (0) | 2021.08.02 |
---|---|
[C#] 유니티에서 FTP로 파일 전송 및 파일 다운로드 (0) | 2021.08.02 |
유니티에서 타프로그램 창 화면 가져오기 (0) | 2021.08.02 |
[C#]유니티 JSON 데이터 받아오기 (0) | 2021.08.02 |
유니티 리얼센스 빌드 후 작동 문제 (0) | 2021.08.01 |