Какой правильный код, чтобы избежать сброса цели в режиме EXTENDED_TRACKING - PullRequest
0 голосов
/ 22 марта 2020

Я использую модель цели, чтобы показать 3D-увеличение. Пока все в порядке, я использую Timeline / Playable Director, чтобы следовать временной шкале каждый раз, когда цель обнаружена. Моя проблема заключается в следующем: поскольку я использую расширенный режим устройства отслеживания, цель переключается при переключении режима отслеживания в расширенный режим отслеживания, и поэтому я хотел бы, чтобы цель запускалась только в случае потери отслеживания, но не когда цель переходит в трекер расширенного режима. Если удалить временную шкалу, она становится нормальной, то есть расширенный режим трекинга работает кооперативно. Кто-нибудь, чтобы помочь мне? Спасибо

protected override void OnTrackingFound()
{
    base.OnTrackingFound();

    // Play Timeline when target is found
    GetComponent<PlayableDirector>().Play();

}

protected override void OnTrackingLost()
{
    base.OnTrackingLost();

    // Stop Timeline when target is lost
    GetComponent<PlayableDirector>().Stop();
}

1 Ответ

0 голосов
/ 22 марта 2020

Я полагаю, ваш сценарий основан на DefaultTrackableEventHandler, который

/// <summary>
/// Implementation of the ITrackableEventHandler function called when the
/// tracking state changes.
/// </summary>
public void OnTrackableStateChanged(TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus)
{
    if (newStatus == TrackableBehaviour.Status.DETECTED ||
        newStatus == TrackableBehaviour.Status.TRACKED ||
        newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
    {
        OnTrackingFound();
    }
    else
    {
        OnTrackingLost();
    }
}

. Как вы видите, OnTrackingFound также вызывается, когда отслеживание изменяется между DETECTED, TRACKED и EXTENDED_TRACKED.


Насколько я знаю, без необходимости слишком много менять, можно просто проверить, играет ли PlayableDirector уже или нет

// Better reference this already via the Inspector
[SerializeField] private PlayableDirector director;

private void Awake()
{
    if(!director) director = GetComponent<PlayableDirector>();
} 

protected override void OnTrackingFound()
{
    base.OnTrackingFound();

    // Play Timeline when target is found
    if(director.state != PlayableState.Playing) director.Play();   
}

protected override void OnTrackingLost()
{
    base.OnTrackingLost();

    // Stop Timeline when target is lost
   director.Stop();
}

Альтернативно Вы можете, конечно, реализовать свою собственную версию обработчика и просто не вызывать методы снова, если состояние в основном одинаковое:

public class MyTrackableEventHandler : MonoBehaviour, ITrackableEventHandler
{
    [SerializeField] private TrackableBehaviour _trackableBehaviour;
    [SerializeField] private PlayableDirector director;

    private void Awake()
    {
        if(!_trackableBehaviour) _trackableBehaviour = GetComponent<TrackableBehaviour>();
        _trackableBehaviour.RegisterTrackableEventHandler(this);

        if(!director) director = GetComponent<PlayableDirector>();
    }

    public void OnTrackableStateChanged(TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus)
    {
        if(previousStatus == newStatus) return;

        var newTracked = newStatus == TrackableBehaviour.Status.DETECTED 
                || newStatus == TrackableBehaviour.Status.TRACKED 
                || newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED;

        var previousTracked = previousStatus == TrackableBehaviour.Status.DETECTED 
                || previousStatus == TrackableBehaviour.Status.TRACKED 
                || previousStatus == TrackableBehaviour.Status.EXTENDED_TRACKED;

        if(newTracked && previousTracked) return;

        if (newTracked)
        {
            OnTrackingFound();
        }
        else
        {
            OnTrackingLost();
        }
    }

    private void OnTrackingFound()
    {
        director.Play();
    }

    private void OnTrackingLost()
    {
        director.Stop();
    }
}

Напечатано на смартфоне, но я надеюсь, что идея проясняется

...