Hey, I am facing the same issue. I've tried to follow the code provided by DavidBeard but it seems it's obsolete since the interface ICloudRecoEventHandler doesn't exist anymore. I am trying to play different videos from different ImageTargets that are allocated on the CloudDataBase. I did most part of it and it's working as expected. But When I try to restart the scanner to scan other image it doesn't work.
Quote:
using UnityEngine;
using Vuforia;
using UnityEngine.Video;
using UnityEngine.UI;
public class SimpleCloudRecoEventHandler : MonoBehaviour
{
public ImageTargetBehaviour ImageTargetTemplate;
public GameObject video;
public Button m_PlayButton;
public RectTransform m_ProgressBar;
private CloudRecoBehaviour mCloudRecoBehaviour;
private VideoPlayer videoPlayer;
private bool mIsScanning = false;
private string mTargetMetadata = "";
void Start()
{
video = GameObject.Find("Video");
videoPlayer = video.GetComponent<VideoPlayer>();
VuforiaARController vuforia = VuforiaARController.Instance;
vuforia.RegisterVuforiaStartedCallback(OnVuforiaStarted);
vuforia.RegisterOnPauseCallback(OnPaused);
}
private void OnVuforiaStarted()
{
CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
}
private void OnPaused(bool paused)
{
if (!paused)
{
CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
}
}
// Register cloud reco callbacks
void Awake()
{
mCloudRecoBehaviour = GetComponent<CloudRecoBehaviour>();
mCloudRecoBehaviour.RegisterOnInitializedEventHandler(OnInitialized);
mCloudRecoBehaviour.RegisterOnInitErrorEventHandler(OnInitError);
mCloudRecoBehaviour.RegisterOnUpdateErrorEventHandler(OnUpdateError);
mCloudRecoBehaviour.RegisterOnStateChangedEventHandler(OnStateChanged);
mCloudRecoBehaviour.RegisterOnNewSearchResultEventHandler(OnNewSearchResult);
}
//Unregister cloud reco callbacks when the handler is destroyed
void OnDestroy()
{
mCloudRecoBehaviour.UnregisterOnInitializedEventHandler(OnInitialized);
mCloudRecoBehaviour.UnregisterOnInitErrorEventHandler(OnInitError);
mCloudRecoBehaviour.UnregisterOnUpdateErrorEventHandler(OnUpdateError);
mCloudRecoBehaviour.UnregisterOnStateChangedEventHandler(OnStateChanged);
mCloudRecoBehaviour.UnregisterOnNewSearchResultEventHandler(OnNewSearchResult);
}
public void OnInitialized(TargetFinder targetFinder)
{
Debug.Log("Cloud Reco initialized");
}
public void OnInitError(TargetFinder.InitState initError)
{
Debug.Log("Cloud Reco init error " + initError.ToString());
}
public void OnUpdateError(TargetFinder.UpdateState updateError)
{
Debug.Log("Cloud Reco update error " + updateError.ToString());
}
public void OnStateChanged(bool scanning)
{
mIsScanning = scanning;
if (scanning)
{
// clear all known trackables
var tracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
tracker.GetTargetFinder<ImageTargetFinder>().ClearTrackables(true);
}
}
// Here we handle a cloud target recognition event
public void OnNewSearchResult(TargetFinder.TargetSearchResult targetSearchResult)
{
// duplicate the referenced image target
GameObject newImageTarget = Instantiate(ImageTargetTemplate.gameObject) as GameObject;
// enable the new result with the same ImageTargetBehaviour:
ImageTargetBehaviour imageTargetBehaviour = mImageTracker.TargetFinder.EnableTracking(targetSearchResult, newImageTarget);
TargetFinder.CloudRecoSearchResult cloudRecoSearchResult = (TargetFinder.CloudRecoSearchResult)targetSearchResult;
// do something with the target metadata
mTargetMetadata = cloudRecoSearchResult.MetaData;
// Build augmentation based on target
if (ImageTargetTemplate)
{
ObjectTracker tracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
tracker.GetTargetFinder<ImageTargetFinder>().EnableTracking(targetSearchResult, ImageTargetTemplate.gameObject);
Vector2 target = ImageTargetTemplate.GetSize();
Vector3 temp = video.transform.localScale;
temp.x = target.x / 9.7f;
temp.z = target.y / 9.7f;
video.transform.localScale = temp;
// stop the target finder (i.e. stop scanning the cloud)
if (imageTargetBehaviour != null)
{
// stop the target finder
mCloudRecoBehaviour.CloudRecoEnabled = false;
}
}
if (mTargetMetadata != "")
{
videoPlayer.url = mTargetMetadata;
}
Play();
}
void Play()
{
PauseAudio(false);
videoPlayer.Play();
ShowPlayButton(false);
}
void PauseAudio(bool pause)
{
for (ushort trackNumber = 0; trackNumber < videoPlayer.audioTrackCount; ++trackNumber)
{
if (pause)
videoPlayer.GetTargetAudioSource(trackNumber).Pause();
else
videoPlayer.GetTargetAudioSource(trackNumber).UnPause();
}
}
void ShowPlayButton(bool enable)
{
m_PlayButton.enabled = enable;
}
void OnGUI()
{
// Display current 'scanning' status
GUI.Box(new Rect(100, 100, 200, 50), mIsScanning ? "Scanning" : "Not scanning");
// Display metadata of latest detected cloud-target
GUI.Box(new Rect(100, 200, 200, 50), "Metadata: " + mTargetMetadata);
// If not scanning, show button
// so that user can restart cloud scanning
if (!mIsScanning)
{
if (GUI.Button(new Rect(100, 300, 200, 50), "Restart Tracking"))
{
// Restart TargetFinder
if (mCloudRecoBehaviour.CloudRecoInitialized && !mCloudRecoBehaviour.CloudRecoEnabled)
{
mTargetMetadata = null;
mCloudRecoBehaviour.CloudRecoEnabled = true;
}
}
}
}
}
Hey, I am facing the same issue. I've tried to follow the code provided by DavidBeard but it seems it's obsolete since the interface ICloudRecoEventHandler doesn't exist anymore. I am trying to play different videos from different ImageTargets that are allocated on the CloudDataBase. I did most part of it and it's working as expected. But When I try to restart the scanner to scan other image it doesn't work.