네이버 블로그 백업 글 입니다.
https://blog.naver.com/keutana/223064349234
[유니티 AR 파운데이션] 이미지 마커가 어디에 등록되어있을까?
회사에서 유지보수를 진행하다보면 유니티 AR파운데이션을 이용하여 AR기능을 수행하는 프로젝트를 받...
blog.naver.com
회사에서 유지보수를 진행하다보면
유니티 AR파운데이션을 이용하여 AR기능을 수행하는 프로젝트를 받을 수 있다.
이미지 마커, 마커 이름 같은 걸 수정하고 싶은데 어디에 있는지 모를 수가 있다.
유니티 AR 파운데이션은 이미지 마커등록을 설정파일에서 등록하는데
Assets - XR - ReferenceImageLibrary 에 등록이 되어있다.
여기서 이미지 마커와 함께 이름을 같이 등록한다.
그렇다면 이미지 마커를 인식했을 때 특정 마커에 반응하는 함수를 호출하려면 어떻게 할까?
다음의 준비물이 필요하다.
1. AR Session Origin 에 붙어있는 AR Tracked Image Manager 스크립트의 인스펙터에 Tracked Image Prefab 이 있다.
-> 여기에 넣어 자동으로 인스턴싱으로 생성될 객체 ( 빈 객체여도 좋음 )를 지정
2. 1번 객체에 붙여서 1번 객체가 생성될 때 불려질 함수를 넣을 스크립트
-> Start에서 매니저 스크립트의 함수를 부른다.
3. 마커가 인식되어 화면에 나타난 객체는 트랙킹이 끊기면 사라지므로 AR 씬에서 2번 스크립트에서 불러지는 함수가 참조할 매니저 스크립트
-> 즉 ReferenceImageLibrary에 있는 마커 리스트 중에서 한 개라도 인식이 되면 화면에 1번 객체가 생성된다.
그러므로 마커를 여러개를 쓰면서 특정 마커마다 행동을 달리하려면 1번 객체가 생성되면서 매니저 스크립트에 알리는 행동이 필요하다.
4. 매니저 스크립트에서는 다음이 필요하다
4-1 public ARTrackedImageManager ARTIM(이름 변경 가능) 으로 변수 선언
-> AR 마커 리스트를 가져와 이벤트로 등록하여 프레임마다 확인하는 작업을 함
-> 매니저 객체에서 인스펙터가 비어있을것이다 인스펙터에 AR Session Origin을 넣자
4-2 Start 함수에서 arim.trackedImagesChanged += arTrackedImageManagerTrackedImagesChanged; (함수 이름은 원하는대로 작성가능) 로 이벤트 등록
public ARTrackedImageManager ARTIM;
void Start()
{
ARTIM.trackedImagesChanged += arTrackedImageManagerTrackedImagesChanged;
}
4-3 함수 선언
// 아무 마커가 인식을 시작되면 해당 함수(이벤트)가 무한 루프
// 이벤트로 등록해서 프레임마다 호출
private void arTrackedImageManagerTrackedImagesChanged(ARTrackedImagesChangedEventArgs obj)
{
// 마커 이미지를 XR - ReferenceImageLibrary에서 가져옴
List<ARTrackedImage> addedImages = obj.added;
// 가져온 것 들 중에서 트랙(인식)한 이미지를 찾는 것
foreach (ARTrackedImage image in addedImages)
{
// 마커 리스트에서 인식된 마커의 이름을 받음
artrack_n = image.referenceImage.name;
}
}
artrack_n 은 string 변수이므로 원하는 이름으로 변경가능
이벤트 함수를 선언하고 등록해놓으면 마커 인식시 자동으로 프레임마다 호출됨
5. 1번 객체가 참조하여 부를 함수 선언
/**
* AR 이미지 인식처리
* AR Tracked Image Manager에 Tracked Image Prefab에 등록하는 객체에 붙은 스크립트이고
* 등록된 이미지가 카메라에 비춰지면 화면에 출력될(생성될) 오브젝트에서 부름
*/
public void checkImageMarker()
{
recognizeMarker(artrack_n);
}
private void recognizeMarker(string trackedMarkerName)
{
for (int i = 0; i < markerList.Length; i++)
{
// 인식한 이미지가 마커 이미지 리스트에 있는가.
if (markerList[i] == trackedMarkerName)
{
// 있다면 원하는 행동하기
}
}
}
markerList는 public string 배열로 선언하여 인스펙터에서 지정하였음 ( 초기화하며 지정해도 된다 ) -> string 으로 넣을 이름은 마커 등록리스트에 써있는 각 마커들의 이름이다.
markerList를 빼고 trackedMarkerName == "markerName" 으로 지정해서 For문 밖으로 빼고 특정한 마커에 대한 작업으로 진행해도 된다.
'Develop > 유니티' 카테고리의 다른 글
[유니티] Easy AR 핸드폰의 화면이 검은색일 때 (Easy AR 3.0) (0) | 2023.05.31 |
---|---|
[유니티 C#] string 문자열에서 특정 문자 사이에 컬러 넣기 (0) | 2023.05.26 |
[유니티 C#] 유니티 텍스트 일괄적으로 폰트 변경하기 (런타임 적용) (0) | 2023.05.26 |
[유니티 C#]텍스트 파일을 읽고 단어 입력하여 비교하기 (3) | 2023.05.26 |
안드로이드에 유니티를 aar로 삽입하여 실행하다가 종료할 때 메모리 누수 해결 방법 (ServiceConnection leaked) (0) | 2023.05.26 |