개발/Unity

유니티 AR - OnTargetStatusChanged로 타겟 상태 관리하기 (Control Target Status with OnTargetStatusChanged in Vuforia)

피로물든딸기 2023. 6. 17. 19:21
반응형

Unity 전체 링크

 

참고

- 유니티 AR 뷰포리아 튜토리얼

- 이미지 타겟팅으로 오브젝트 띄우기 From Image

- OnTargetFound, Lost로 AR 오브젝트 추적하기

- https://library.vuforia.com/model-targets/optimizing-model-target-tracking

 

이미지 타겟팅으로 AR 오브젝트를 만들었다.

그런데 타겟이 되는 이미지를 제거해도 아래와 같이 오브젝트가 남는 현상이 발생한다.

 

아래 ImageTarget의 Advanced에서 Optimize tracking forAR_CONTROLLER로 설정하면 

이미지 트래킹더 이상 이어지지 않을 경우 오브젝트가 사라지게 된다.


스크립트로 직접 제어하기

 

위와 같은 현상은 뷰포리아에서 제공하는 OnTargetStatusChanged를 이용하면 스크립트로 제어할 수 있다.

 

Target에 대한 상태를 관리하려면 ObserverBehaviour를 가져와야한다.

    ObserverBehaviour imageTargetBehaviour;
    
    void Start()
    {
        imageTargetBehaviour = this.GetComponentInParent<ObserverBehaviour>();
        imageTargetBehaviour.OnTargetStatusChanged += onTargetStatusChanged;
    }

 

ObserverBehaviour는 이미지 타겟의 DefaultObserverEventHandler.cs에 있기 때문에

GetComponentInParent를 이용해서 컴포넌트를 가져온다.

 

ObserverBehaviourOnTargetStatusChanged 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:

반응형