2022. 5. 21. 16:57ㆍUnity/AR
이번 2022년도 1학기 "일본학과 캡스톤 디자인"과목에서 우리팀은 AR기술을 활용한 일본어 학습 보조카드를 제작하기로 하였다. 이 팀에서 기술 담당인 나는 예전 Unity 컨퍼런스에서 본 기억이 있는 AR Foundation을 활용해 프로젝트를 진행하기로 하였다.
프로젝트의 결론부터 말하자면 완성을 할 수 있었다. 아래는 시연 영상이다.
지금부터는 위 시스템을 제작하기 까지의 과정을 기록하려고 한다.
AR Foundation
Unity에서 제공하는 패키지 중의 하나인 AR Foundation은 AR시스템을 쉽게 구축할 수 있는 기능을 제공한다.
이를 사용하기 위한 초기 세팅을 살펴보자.
먼저 AR Foundation의 빌드는 안드로이드 or ios로 빌드되어야 하기 때문에 먼저 플랫폼을 바꿔주어야 한다.
필자는 안드로이드로 빌드를 했기 때문에 위처럼 셋팅을 했다.
현재 프로젝트는 64비트 아키텍처를 지원해야 하기 때문에 IL2CPP를 선택해 주었다.
위처럼 XR Plug-in Management에서 AR Core를 체크해주면 기본적인 셋팅은 끝이다.
다음은 프로젝트 내부에서 설정 해주어야 하는 것인데.
위처럼 AR Session과 AR Session Origin을 만들어 주어야한다.
그리고 AR Session Origin의 자식에 AR Camera가 존재하니 기본적으로 존재 했던 Main Camera를 삭제해 준다.
만약 여기서 이미지인식을 기반으로 하는 오브젝트 설치를 원한다면
AR Tracked Image Manager라는 컴포넌트를 설치하고 Serialized Library에 인식될 이미지를 넣고 Image prefab에 설치할 오브젝트를 넣으면 된다.
위 예시는 AR Foundation 분석중 직접 간단하게 만들어 본 시연영상이다.
QR Foundation
하지만 우리의 프로젝트는 QR코드를 인식을 통해 물체를 띄우는 방향으로 기획팀이 요구사항을 주었다. 그렇기에 기존 AR Foundation의 이미지 트래킹으로서는 한계점이 있었는데. 이는 인식이 되는 이미지가 너무 간단하거나 구분이 잘 안되는 특징이 있으면 에러가 나기 때문이다.
그렇기에 이를 타파할 방법이 필요 했는데 이는 에셋 스토어에서 QR코드를 자동으로 인식해 QR코드의 Stirng값과 위치를 판별해주는 외부 에셋을 구매를 진행 하였다.
저작권으로 인하여 내부 코드 해석은 공개하지 못하지만 QR Foundation의 가장 큰 기능은 위에서도 기술해 놓았듯이 QR코드의 String값 식별과 위치값 판별이었다. 그렇기에 위 에셋에서 제공하는 스크립트를 전부 해석한 뒤 물체를 Instantiate 해주는 기능을 가진 스크립트 내부에서 이러한 코드들을 추가해 주었다.
if (content == "ame_asdfghjklzxcvbnmqwertyuiopsdfv")
{
QRCodeSupporter qRCodeSupporter = GetComponent<QRCodeSupporter>();
prefab = qRCodeSupporter.ame;
registeredGameObject = Instantiate(prefab);
registeredString = "□□ : 비";
}
else if(content == "isu_vhduiqwnkslcmawidnfoclsmclsmzt")
{
QRCodeSupporter qRCodeSupporter = GetComponent<QRCodeSupporter>();
prefab = qRCodeSupporter.isu;
registeredGameObject = Instantiate(prefab);
registeredString = "□□ : 의자";
}
else if (content == "undou_djcnaksieheuqowoodncjskpskki")
{
QRCodeSupporter qRCodeSupporter = GetComponent<QRCodeSupporter>();
prefab = qRCodeSupporter.undou;
registeredGameObject = Instantiate(prefab);
registeredString = "□□ : 운동";
}
else if (content == "egaki_djskcnalsdjidnfkalsncjsjcnjs")
{
QRCodeSupporter qRCodeSupporter = GetComponent<QRCodeSupporter>();
prefab = qRCodeSupporter.egaki;
registeredGameObject = Instantiate(prefab);
registeredString = "□ : 그림";
}
else if (content == "ongaku_djcjjwueuqndnckdhahsefjklle")
{
QRCodeSupporter qRCodeSupporter = GetComponent<QRCodeSupporter>();
prefab = qRCodeSupporter.ongaku;
registeredGameObject = Instantiate(prefab);
registeredString = "□□ : 음악";
}
}
else
{
registeredGameObject = new GameObject();
}
보이는 것과 같이 content를 통해 외부에서 QR코드의 Stirng값이 들어오면 그 것을 통해 if문 판별을 해 적절한 물체를 instantiate해주는 모습을 볼 수 있다.
하지만 if문 내에 String을 판별해주는 문이 조금 특이한 걸 볼 수 있는데 바로 너무 String에 쓰레기값이 길다는 것이다.
이는 QR코드를 제작할 때 Stirng의 값을 너무 짧게 주면 그만큼 QR코드가 단순해지는데 여기서 QR코드가 너무 단순해지면 정확성이 떨어지기 때문에 필자가 직접 QR코드를 제작할 때 일부러 쓰레기 값을 길게 붙혀서 QR코드를 복잡하게 만든 것이다.
참고로 여기서 QRCodeSupporter라는 컴포넌트가 나오는데 이는 필자가 수많은 프리팹들을 일괄적으로 관리 해주기 위해 만든 스크립트이다.
이렇게 AR Foundation과 관련한 기술적인 내용이 완성이 되었다.
그 외 디자인
그 외로 물체의 애니메이팅이나 디자인등도 역시 필자가 직접 진행을 하였다.