C# Unity-访问引发Null异常的事件

C# Unity-访问引发Null异常的事件,c#,unity3d,events,vuforia,C#,Unity3d,Events,Vuforia,我有一个脚本从层次结构访问Vuforia的实例化游戏对象,并向其中添加一个组件: IEnumerable<TrackableBehaviour> tbs = TrackerManager.Instance.GetStateManager().GetTrackableBehaviours(); foreach (TrackableBehaviour tb in tbs) { if (tb.TrackableName == "Fashion") { if (tb.

我有一个脚本从层次结构访问Vuforia的实例化游戏对象,并向其中添加一个组件:

IEnumerable<TrackableBehaviour> tbs = TrackerManager.Instance.GetStateManager().GetTrackableBehaviours();

foreach (TrackableBehaviour tb in tbs)
{
if (tb.TrackableName == "Fashion")
{

if (tb.name == "New Game Object")
{

// change generic name to include trackable name
tb.gameObject.name = ++counter + "DynamicImageTarget-" + tb.TrackableName;

// add additional script components for trackable
tb.gameObject.AddComponent<DefaultTrackableEventHandler>();
tb.gameObject.AddComponent<TurnOffBehaviour>();
为什么我无法访问脚本上的事件

/*============================================================================== 版权所有(c)2019 PTC Inc.保留所有权利

版权所有(c)2010-2014高通互联体验有限公司。 版权所有。 机密和专有-受版权和其他法律保护。 ==============================================================================*/

using UnityEngine;
using UnityEngine.Events;
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
{
    public enum TrackingStatusFilter
    {
        Tracked,
        Tracked_ExtendedTracked,
        Tracked_ExtendedTracked_Limited
    }

    /// <summary>
    /// A filter that can be set to either:
    /// - Only consider a target if it's in view (TRACKED)
    /// - Also consider the target if's outside of the view, but the environment is tracked (EXTENDED_TRACKED)
    /// - Even consider the target if tracking is in LIMITED mode, e.g. the environment is just 3dof tracked.
    /// </summary>
    public TrackingStatusFilter StatusFilter = TrackingStatusFilter.Tracked_ExtendedTracked_Limited;
    public UnityEvent OnTargetFound;
    public UnityEvent OnTargetLost;


    protected TrackableBehaviour mTrackableBehaviour;
    protected TrackableBehaviour.Status m_PreviousStatus;
    protected TrackableBehaviour.Status m_NewStatus;
    protected bool m_CallbackReceivedOnce = false;

    protected virtual void Start()
    {
        mTrackableBehaviour = GetComponent<TrackableBehaviour>();

        if (mTrackableBehaviour)
        {
            mTrackableBehaviour.RegisterOnTrackableStatusChanged(OnTrackableStatusChanged);
        }
    }

    protected virtual void OnDestroy()
    {
        if (mTrackableBehaviour)
        {
            mTrackableBehaviour.UnregisterOnTrackableStatusChanged(OnTrackableStatusChanged);
        }
    }

    void OnTrackableStatusChanged(TrackableBehaviour.StatusChangeResult statusChangeResult)
    {
        m_PreviousStatus = statusChangeResult.PreviousStatus;
        m_NewStatus = statusChangeResult.NewStatus;

        Debug.LogFormat("Trackable {0} {1} -- {2}",
            mTrackableBehaviour.TrackableName,
            mTrackableBehaviour.CurrentStatus,
            mTrackableBehaviour.CurrentStatusInfo);

        HandleTrackableStatusChanged();
    }

    protected virtual void HandleTrackableStatusChanged()
    {
        if (!ShouldBeRendered(m_PreviousStatus) &&
            ShouldBeRendered(m_NewStatus))
        {
            OnTrackingFound();
        }
        else if (ShouldBeRendered(m_PreviousStatus) &&
                 !ShouldBeRendered(m_NewStatus))
        {
            OnTrackingLost();
        }
        else
        {
            if (!m_CallbackReceivedOnce && !ShouldBeRendered(m_NewStatus))
            {
                // This is the first time we are receiving this callback, and the target is not visible yet.
                // --> Hide the augmentation.
                OnTrackingLost();
            }
        }

        m_CallbackReceivedOnce = true;
    }

    protected bool ShouldBeRendered(TrackableBehaviour.Status status)
    {
        if (status == TrackableBehaviour.Status.DETECTED ||
            status == TrackableBehaviour.Status.TRACKED)
        {
            // always render the augmentation when status is DETECTED or TRACKED, regardless of filter
            return true;
        }

        if (StatusFilter == TrackingStatusFilter.Tracked_ExtendedTracked)
        {
            if (status == TrackableBehaviour.Status.EXTENDED_TRACKED)
            {
                // also return true if the target is extended tracked
                return true;
            }
        }

        if (StatusFilter == TrackingStatusFilter.Tracked_ExtendedTracked_Limited)
        {
            if (status == TrackableBehaviour.Status.EXTENDED_TRACKED ||
                status == TrackableBehaviour.Status.LIMITED)
            {
                // in this mode, render the augmentation even if the target's tracking status is LIMITED.
                // this is mainly recommended for Anchors.
                return true;
            }
        }

        return false;
    }

    protected virtual void OnTrackingFound()
    {
        if (mTrackableBehaviour)
        {
            var rendererComponents = mTrackableBehaviour.GetComponentsInChildren<Renderer>(true);
            var colliderComponents = mTrackableBehaviour.GetComponentsInChildren<Collider>(true);
            var canvasComponents = mTrackableBehaviour.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;
        }

        if (OnTargetFound != null)
            OnTargetFound.Invoke();
    }

    protected virtual void OnTrackingLost()
    {
        if (mTrackableBehaviour)
        {
            var rendererComponents = mTrackableBehaviour.GetComponentsInChildren<Renderer>(true);
            var colliderComponents = mTrackableBehaviour.GetComponentsInChildren<Collider>(true);
            var canvasComponents = mTrackableBehaviour.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;
        }

        if (OnTargetLost != null)
            OnTargetLost.Invoke();
    }
}
使用UnityEngine;
使用UnityEngine.Events;
使用Vuforia;
/// 
///实现ITrackableEventHandler接口的自定义处理程序。
///
///升级Vuforia版本时,可能会覆盖对此文件所做的更改。
//在执行自定义事件处理程序行为时,应考虑继承此类。
/// 
公共类DefaultTrackableEventHandler:MonoBehavior
{
公共枚举跟踪状态筛选器
{
追踪,
Tracked_extended Tracked,
Tracked_extended Tracked_Limited
}
/// 
///可设置为以下任一项的筛选器:
//-只考虑目标,如果它在视图中(跟踪)
///-还考虑目标是否在视图之外,但跟踪环境(扩展跟踪)
// - -甚至考虑目标,如果跟踪是在有限的模式,例如,环境仅仅是3DOF跟踪。
/// 
public TrackingStatusFilter StatusFilter=TrackingStatusFilter.Tracked\u extendedctracked\u Limited;
公共单位事件与目标基金会;
公共UnityEvent OnTargetLost;
受保护的可追踪行为;
受保护的可跟踪行为。状态m_PreviousStatus;
受保护的可跟踪行为。状态m_NewStatus;
受保护的bool m_CallbackReceivedOnce=false;
受保护的虚拟void Start()
{
mtrackablebhavior=GetComponent();
if(MTrackableBehavior)
{
mtrackablebhavior.RegisterOnTrackableStatusChanged(OnTrackableStatusChanged);
}
}
受保护的虚拟空OnDestroy()
{
if(MTrackableBehavior)
{
mtrackablebhavior.UnregisterOnTrackableStatusChanged(OnTrackableStatusChanged);
}
}
void OnTracableStatusChanged(TracableBehavior.StatusChangeResult状态更改结果)
{
m_PreviousStatus=状态更改结果。PreviousStatus;
m_NewStatus=statuschangesult.NewStatus;
LogFormat(“可跟踪的{0}{1}--{2}”,
MTrackableBehavior.TrackableName,
MTrackableBehavior.CurrentStatus,
mtrackablebhavior.CurrentStatusInfo);
HandleTrackableStatusChanged();
}
受保护的虚拟void HandleTrackableStatusChanged()
{
如果(!ShouldBeRendered)(m_PreviousStatus)&&
应该得到(m_NewStatus))
{
OnTrackingFound();
}
else if(应指定)(m_先前状态)&&
!应该知道(m_NewStatus))
{
OnTrackingLost();
}
其他的
{
如果(!m_CallbackReceivedOnce&&!应提交(m_NewStatus))
{
//这是我们第一次收到这个回调,目标还不可见。
//-->隐藏增强。
OnTrackingLost();
}
}
m_CallbackReceivedOnce=true;
}
应指定受保护的对象(可跟踪行为.状态)
{
if(status==trackablebehavior.status.DETECTED||
status==trackablebehavior.status.TRACKED)
{
//在检测或跟踪状态时始终呈现增强,而不考虑过滤器
返回true;
}
if(StatusFilter==TrackingStatusFilter.Tracked\u ExtendedTracked)
{
if(status==trackablebehavior.status.EXTENDED\u TRACKED)
{
//如果目标被扩展跟踪,也返回true
返回true;
}
}
if(StatusFilter==TrackingStatusFilter.Tracked\u ExtendedTracked\u Limited)
{
if(status==trackablebehavior.status.EXTENDED\u跟踪||
status==trackablebehavior.status.LIMITED)
{
//在此模式下,即使目标的跟踪状态受限,也渲染增强。
//这主要建议用于锚固件。
返回true;
}
}
返回false;
}
受保护的虚拟空间OnTrackingFound()
{
if(MTrackableBehavior)
{
var rendererComponents=mtrackablebhavior.GetComponentsInChildren(true);
var colliderComponents=mtrackablebhavior.GetComponentsInChildren(true);
var canvasComponents=mtrackablebhavior.GetComponentsInChildren(true);
//启用渲染:
foreach(RenderComponents中的变量组件)
component.enabled=true;
//启用碰撞器:
foreach(colliderComponents中的var组件)
component.enabled=true;
//启用画布':
foreach(canvasComponents中的var组件)
component.enabled=true;
}
如果(OnTargetFound!=null)
OnTargetFound.Invoke();
}
受保护的虚拟空间OnTrackingLost()
{
if(MTrackableBehavior)
{
var rendererComponents=mtrackablebhavior.GetComponentsInChildren(true);
var colliderComponents=mtrackablebhavior.GetComponentsInChildren(true);
var canvasComponents=mtrackablebhavior.GetComponentsInChildren(true);
//禁用渲染:
foreach(RenderComponents中的变量组件)
component.enabled=false;
//禁用碰撞器:
foreach(var)compone
tb.gameObject.GetComponent<DefaultTrackableEventHandler>().OnTargetFound.RemoveAllListeners();
tb.gameObject.GetComponent<DefaultTrackableEventHandler>().enable = false;
void DressFound()
{
augmentation.SetActive(true);

}
using UnityEngine;
using UnityEngine.Events;
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
{
    public enum TrackingStatusFilter
    {
        Tracked,
        Tracked_ExtendedTracked,
        Tracked_ExtendedTracked_Limited
    }

    /// <summary>
    /// A filter that can be set to either:
    /// - Only consider a target if it's in view (TRACKED)
    /// - Also consider the target if's outside of the view, but the environment is tracked (EXTENDED_TRACKED)
    /// - Even consider the target if tracking is in LIMITED mode, e.g. the environment is just 3dof tracked.
    /// </summary>
    public TrackingStatusFilter StatusFilter = TrackingStatusFilter.Tracked_ExtendedTracked_Limited;
    public UnityEvent OnTargetFound;
    public UnityEvent OnTargetLost;


    protected TrackableBehaviour mTrackableBehaviour;
    protected TrackableBehaviour.Status m_PreviousStatus;
    protected TrackableBehaviour.Status m_NewStatus;
    protected bool m_CallbackReceivedOnce = false;

    protected virtual void Start()
    {
        mTrackableBehaviour = GetComponent<TrackableBehaviour>();

        if (mTrackableBehaviour)
        {
            mTrackableBehaviour.RegisterOnTrackableStatusChanged(OnTrackableStatusChanged);
        }
    }

    protected virtual void OnDestroy()
    {
        if (mTrackableBehaviour)
        {
            mTrackableBehaviour.UnregisterOnTrackableStatusChanged(OnTrackableStatusChanged);
        }
    }

    void OnTrackableStatusChanged(TrackableBehaviour.StatusChangeResult statusChangeResult)
    {
        m_PreviousStatus = statusChangeResult.PreviousStatus;
        m_NewStatus = statusChangeResult.NewStatus;

        Debug.LogFormat("Trackable {0} {1} -- {2}",
            mTrackableBehaviour.TrackableName,
            mTrackableBehaviour.CurrentStatus,
            mTrackableBehaviour.CurrentStatusInfo);

        HandleTrackableStatusChanged();
    }

    protected virtual void HandleTrackableStatusChanged()
    {
        if (!ShouldBeRendered(m_PreviousStatus) &&
            ShouldBeRendered(m_NewStatus))
        {
            OnTrackingFound();
        }
        else if (ShouldBeRendered(m_PreviousStatus) &&
                 !ShouldBeRendered(m_NewStatus))
        {
            OnTrackingLost();
        }
        else
        {
            if (!m_CallbackReceivedOnce && !ShouldBeRendered(m_NewStatus))
            {
                // This is the first time we are receiving this callback, and the target is not visible yet.
                // --> Hide the augmentation.
                OnTrackingLost();
            }
        }

        m_CallbackReceivedOnce = true;
    }

    protected bool ShouldBeRendered(TrackableBehaviour.Status status)
    {
        if (status == TrackableBehaviour.Status.DETECTED ||
            status == TrackableBehaviour.Status.TRACKED)
        {
            // always render the augmentation when status is DETECTED or TRACKED, regardless of filter
            return true;
        }

        if (StatusFilter == TrackingStatusFilter.Tracked_ExtendedTracked)
        {
            if (status == TrackableBehaviour.Status.EXTENDED_TRACKED)
            {
                // also return true if the target is extended tracked
                return true;
            }
        }

        if (StatusFilter == TrackingStatusFilter.Tracked_ExtendedTracked_Limited)
        {
            if (status == TrackableBehaviour.Status.EXTENDED_TRACKED ||
                status == TrackableBehaviour.Status.LIMITED)
            {
                // in this mode, render the augmentation even if the target's tracking status is LIMITED.
                // this is mainly recommended for Anchors.
                return true;
            }
        }

        return false;
    }

    protected virtual void OnTrackingFound()
    {
        if (mTrackableBehaviour)
        {
            var rendererComponents = mTrackableBehaviour.GetComponentsInChildren<Renderer>(true);
            var colliderComponents = mTrackableBehaviour.GetComponentsInChildren<Collider>(true);
            var canvasComponents = mTrackableBehaviour.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;
        }

        if (OnTargetFound != null)
            OnTargetFound.Invoke();
    }

    protected virtual void OnTrackingLost()
    {
        if (mTrackableBehaviour)
        {
            var rendererComponents = mTrackableBehaviour.GetComponentsInChildren<Renderer>(true);
            var colliderComponents = mTrackableBehaviour.GetComponentsInChildren<Collider>(true);
            var canvasComponents = mTrackableBehaviour.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;
        }

        if (OnTargetLost != null)
            OnTargetLost.Invoke();
    }
}
public UnityEvent OnTargetFound = new UnityEvent();
public UnityEvent OnTargetLost = new UnityEvent();