Unity Vuforia Multiple Targets Видео Автозапуск Выпуск - PullRequest
1 голос
/ 14 октября 2019

У меня проблема с Unity. Я пытался найти решение онлайн, протестировал его, но не работает. Прямо сейчас я разрабатываю приложение AR с Unity и Vuforia. Я использую несколько целей изображения с 3D-объектами и видео.

Проблема в том, что видео будет воспроизводиться автоматически без сканирования цели. Я снял флажок «Воспроизвести при пробуждении», но он покажет мне только белый квад (как я прикрепил видео к объекту квадрата).

Я также пытался добавить quad.Play () &quad.Stop () в сценарии DefaultTrackableEventHandler, так как некоторым людям удается заставить его работать.

Вот сценарии:

/*==============================================================================
Copyright (c) 2017 PTC Inc. All Rights Reserved.

Copyright (c) 2010-2014 Qualcomm Connected Experiences, Inc.
All Rights Reserved.
Confidential and Proprietary - Protected under copyright and other laws.
==============================================================================*/

using UnityEngine;
using Vuforia;

/// <summary>
/// A custom handler that implements the ITrackableEventHandler interface.
///
/// Changes made to this file could be overwritten when upgrading the Vuforia version.
/// When implementing custom event handler behavior, consider inheriting from this class instead.
/// </summary>
public class DefaultTrackableEventHandler : MonoBehaviour, ITrackableEventHandler
{

    public UnityEngine.Video.VideoPlayer quad;

    #region PROTECTED_MEMBER_VARIABLES

    protected TrackableBehaviour mTrackableBehaviour;
    protected TrackableBehaviour.Status m_PreviousStatus;
    protected TrackableBehaviour.Status m_NewStatus;

    #endregion // PROTECTED_MEMBER_VARIABLES

    #region UNITY_MONOBEHAVIOUR_METHODS

    protected virtual void Start()
    {
        mTrackableBehaviour = GetComponent<TrackableBehaviour>();
        if (mTrackableBehaviour)
            mTrackableBehaviour.RegisterTrackableEventHandler(this);
    }

    protected virtual void OnDestroy()
    {
        if (mTrackableBehaviour)
            mTrackableBehaviour.UnregisterTrackableEventHandler(this);
    }

    #endregion // UNITY_MONOBEHAVIOUR_METHODS

    #region PUBLIC_METHODS

    /// <summary>
    ///     Implementation of the ITrackableEventHandler function called when the
    ///     tracking state changes.
    /// </summary>
    public void OnTrackableStateChanged(
        TrackableBehaviour.Status previousStatus,
        TrackableBehaviour.Status newStatus)
    {
        m_PreviousStatus = previousStatus;
        m_NewStatus = newStatus;

        if (newStatus == TrackableBehaviour.Status.DETECTED ||
            newStatus == TrackableBehaviour.Status.TRACKED ||
            newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
        {
            Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
            OnTrackingFound();
        }
        else if (previousStatus == TrackableBehaviour.Status.TRACKED &&
                 newStatus == TrackableBehaviour.Status.NO_POSE)
        {
            Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
            OnTrackingLost();
        }
        else
        {
            // For combo of previousStatus=UNKNOWN + newStatus=UNKNOWN|NOT_FOUND
            // Vuforia is starting, but tracking has not been lost or found yet
            // Call OnTrackingLost() to hide the augmentations
            OnTrackingLost();
        }
    }

    #endregion // PUBLIC_METHODS

    #region PROTECTED_METHODS

    protected virtual void OnTrackingFound()
    {
        quad.Play();
        var rendererComponents = GetComponentsInChildren<Renderer>(true);
        var colliderComponents = GetComponentsInChildren<Collider>(true);
        var canvasComponents = GetComponentsInChildren<Canvas>(true);

        // Enable rendering:
        foreach (var component in rendererComponents)
            component.enabled = true;

        // Enable colliders:
        foreach (var component in colliderComponents)
            component.enabled = true;

        // Enable canvas':
        foreach (var component in canvasComponents)
            component.enabled = true;
    }


    protected virtual void OnTrackingLost()
    {
        quad.Stop();
        var rendererComponents = GetComponentsInChildren<Renderer>(true);
        var colliderComponents = GetComponentsInChildren<Collider>(true);
        var canvasComponents = GetComponentsInChildren<Canvas>(true);

        // Disable rendering:
        foreach (var component in rendererComponents)
            component.enabled = false;

        // Disable colliders:
        foreach (var component in colliderComponents)
            component.enabled = false;

        // Disable canvas':
        foreach (var component in canvasComponents)
            component.enabled = false;
    }

    #endregion // PROTECTED_METHODS
}

Надеюсь, что вы, ребята, можете помочь. Спасибо:)

1 Ответ

0 голосов
/ 07 ноября 2019

Вам необходимо добавить код для воспроизведения и приостановки воспроизведения видео в OnTrackingFound () и OnTrackingLost () соответственно.

Для OnTrackingFound ()

if (mTrackableBehaviour.gameObject.GetComponentInChildren<VideoPlayer>() != null)
   {
            mTrackableBehaviour.gameObject.GetComponentInChildren<VideoPlayer>().Play();
   }

Для OnTrackingLost ()

if (mTrackableBehaviour.gameObject.GetComponentInChildren<VideoPlayer>() != null)
    {
            mTrackableBehaviour.gameObject.GetComponentInChildren<VideoPlayer>().Pause();
    }

Полный скрипт. Замените ваш скрипт этим кодом.


using UnityEngine;

using Vuforia;

using UnityEngine.Video;      //added

/// <summary>

///     A custom handler that implements the ITrackableEventHandler interface.

/// </summary>

public class DefaultTrackableEventHandler : MonoBehaviour, ITrackableEventHandler

{

    #region PRIVATE_MEMBER_VARIABLES

    protected TrackableBehaviour mTrackableBehaviour;

    #endregion // PRIVATE_MEMBER_VARIABLES

    #region UNTIY_MONOBEHAVIOUR_METHODS

    protected virtual void Start()

    {

        mTrackableBehaviour = GetComponent<TrackableBehaviour>();

        if (mTrackableBehaviour)

            mTrackableBehaviour.RegisterTrackableEventHandler(this);

    }

    #endregion // UNTIY_MONOBEHAVIOUR_METHODS

    #region PUBLIC_METHODS

    /// <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)

        {

            Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");

            OnTrackingFound();

        }

        else if (previousStatus == TrackableBehaviour.Status.TRACKED &&

                 newStatus == TrackableBehaviour.Status.NO_POSE)

        {

            Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");

            OnTrackingLost();

        }

        else

        {

            // For combo of previousStatus=UNKNOWN + newStatus=UNKNOWN|NOT_FOUND

            // Vuforia is starting, but tracking has not been lost or found yet

            // Call OnTrackingLost() to hide the augmentations

            OnTrackingLost();

        }

    }

    #endregion // PUBLIC_METHODS

    #region PRIVATE_METHODS

    protected virtual void OnTrackingFound()

    {

        var rendererComponents = GetComponentsInChildren<Renderer>(true);

        var colliderComponents = GetComponentsInChildren<Collider>(true);

        var canvasComponents = GetComponentsInChildren<Canvas>(true);

        foreach (var component in rendererComponents)

            component.enabled = true;

        // Enable colliders:

        foreach (var component in colliderComponents)

            component.enabled = true;

        // Enable canvas':

        foreach (var component in canvasComponents)

            component.enabled = true;

        // added

        if (mTrackableBehaviour.gameObject.GetComponentInChildren<VideoPlayer>() != null)

        {

            mTrackableBehaviour.gameObject.GetComponentInChildren<VideoPlayer>().Play();

        }

    }



    protected virtual void OnTrackingLost()

    {

        var rendererComponents = GetComponentsInChildren<Renderer>(true);

        var colliderComponents = GetComponentsInChildren<Collider>(true);

        var canvasComponents = GetComponentsInChildren<Canvas>(true);

        // Disable rendering:

        foreach (var component in rendererComponents)

            component.enabled = false;

        // Disable colliders:

        foreach (var component in colliderComponents)

            component.enabled = false;

        // Disable canvas':

        foreach (var component in canvasComponents)

            component.enabled = false;

        // added

        if (mTrackableBehaviour.gameObject.GetComponentInChildren<VideoPlayer>() != null)

        {

            mTrackableBehaviour.gameObject.GetComponentInChildren<VideoPlayer>().Pause();

        }

    }

    #endregion // PRIVATE_METHODS

}

...