유니티 AR - OnTargetStatusChanged로 타겟 상태 관리하기 (Control Target Status with OnTargetStatusChanged in Vuforia)
참고
- 이미지 타겟팅으로 오브젝트 띄우기 From Image
- OnTargetFound, Lost로 AR 오브젝트 추적하기
- https://library.vuforia.com/model-targets/optimizing-model-target-tracking
이미지 타겟팅으로 AR 오브젝트를 만들었다.
그런데 타겟이 되는 이미지를 제거해도 아래와 같이 오브젝트가 남는 현상이 발생한다.
아래 ImageTarget의 Advanced에서 Optimize tracking for을 AR_CONTROLLER로 설정하면
이미지 트래킹이 더 이상 이어지지 않을 경우 오브젝트가 사라지게 된다.
스크립트로 직접 제어하기
위와 같은 현상은 뷰포리아에서 제공하는 OnTargetStatusChanged를 이용하면 스크립트로 제어할 수 있다.
Target에 대한 상태를 관리하려면 ObserverBehaviour를 가져와야한다.
ObserverBehaviour imageTargetBehaviour;
void Start()
{
imageTargetBehaviour = this.GetComponentInParent<ObserverBehaviour>();
imageTargetBehaviour.OnTargetStatusChanged += onTargetStatusChanged;
}
ObserverBehaviour는 이미지 타겟의 DefaultObserverEventHandler.cs에 있기 때문에
GetComponentInParent를 이용해서 컴포넌트를 가져온다.
ObserverBehaviour의 OnTargetStatusChanged Action에 아래의 메서드를 추가하였다.
타겟 이미지를 찾으면 Status.TRACKED가 되고, 이때 오브젝트를 보여준다.
반대로 이미지를 놓치게 된다면 Status.EXTENDED_TRACKED가 되어 오브젝트를 사라지게 하였다.
void onTargetStatusChanged(ObserverBehaviour observerbehavour, TargetStatus status)
{
if (status.Status == Status.TRACKED && status.StatusInfo == StatusInfo.NORMAL)
{
Debug.Log("Get Target Image!");
this.gameObject.SetActive(true);
}
if (status.Status == Status.EXTENDED_TRACKED && status.StatusInfo == StatusInfo.NORMAL)
{
Debug.Log("Miss Target Image!");
this.gameObject.SetActive(false);
}
}
AR 카메라가 타겟이 되는 이미지를 찾는 상태, 그리고 이미지를 놓친 상태가 되면 위의 메서드가 실행된다.
이제 이미지가 사라지면 정상적으로 오브젝트가 사라진다.
또한 위의 로그도 확인할 수 있다.
전체 코드는 다음과 같다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;
public class TargetTracker : MonoBehaviour
{
ObserverBehaviour imageTargetBehaviour;
void Start()
{
imageTargetBehaviour = this.GetComponentInParent<ObserverBehaviour>();
imageTargetBehaviour.OnTargetStatusChanged += onTargetStatusChanged;
}
void onTargetStatusChanged(ObserverBehaviour observerbehavour, TargetStatus status)
{
if (status.Status == Status.TRACKED && status.StatusInfo == StatusInfo.NORMAL)
{
Debug.Log("Get Target Image!");
this.gameObject.SetActive(true);
}
if (status.Status == Status.EXTENDED_TRACKED && status.StatusInfo == StatusInfo.NORMAL)
{
Debug.Log("Miss Target Image!");
this.gameObject.SetActive(false);
}
}
}
Unity Plus:
Unity Pro:
Unity 프리미엄 학습: