Я полагаю, ваш сценарий основан на 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();
}
}
Напечатано на смартфоне, но я надеюсь, что идея проясняется