Hello,
I am trying to selectively render ar trackables on an Image Target.
I have written a script that uses a "Next" button to advance a counter. A script on my AR Trackable looks at the counter and executes renderer.enabled = true when the counter is above a set point.
My script works, but unfortunately interferes with turning the rendering off when Tracking is lost. I am trying to figure out how I can have my selective rendering, but always turn it off if tracking is lost.
I added a public variable to DefaultTrackableEventHandler.cs
/*============================================================================== Copyright (c) 2010-2014 Qualcomm Connected Experiences, Inc. All Rights Reserved. Confidential and Proprietary - Qualcomm Connected Experiences, Inc. ==============================================================================*/ using UnityEngine; /// <summary> /// A custom handler that implements the ITrackableEventHandler interface. /// </summary> public class DefaultTrackableEventHandler : MonoBehaviour, ITrackableEventHandler { // public var public string itstatus; #region PRIVATE_MEMBER_VARIABLES private TrackableBehaviour mTrackableBehaviour; #endregion // PRIVATE_MEMBER_VARIABLES #region UNTIY_MONOBEHAVIOUR_METHODS void Start() { itstatus = "lost"; 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) { OnTrackingFound(); } else { OnTrackingLost(); } } #endregion // PUBLIC_METHODS #region PRIVATE_METHODS private void OnTrackingFound() { itstatus = "found"; Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true); Collider[] colliderComponents = GetComponentsInChildren<Collider>(true); // Enable rendering: foreach (Renderer component in rendererComponents) { component.enabled = true; } // Enable colliders: foreach (Collider component in colliderComponents) { component.enabled = true; } Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found"); } private void OnTrackingLost() { itstatus = "lost"; Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true); Collider[] colliderComponents = GetComponentsInChildren<Collider>(true); // Disable rendering: foreach (Renderer component in rendererComponents) { component.enabled = false; } // Disable colliders: foreach (Collider component in colliderComponents) { component.enabled = false; } Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost"); } #endregion // PRIVATE_METHODS }
And I try to use that variable the script on my trackable:
using UnityEngine; using System.Collections; public class Activate01 : MonoBehaviour { public GameObject player; private NextButton2 playerScript; private DefaultTrackableEventHandler trackstatus; void Start () { trackstatus = player.GetComponent<DefaultTrackableEventHandler> (); playerScript = player.GetComponent<NextButton2> (); } // Update is called once per frame void LateUpdate () { if(playerScript.nextcounter >= 1 && trackstatus.itstatus == "found") { Debug.Log (And "01 On"); renderer.enabled = true; } else { Debug.Log ("01 Off"); renderer.enabled = false; } } }
My script only partially works. I am also getting this error: NullReferenceException: Object reference not set to an instance of an objectActivate01.LateUpdate () (at Assets/Scripts/Activate01.cs:15)
Any ideas on what I need to do to make this work?