Android C#调用其他类变量,但返回null(Unity3D)

Android C#调用其他类变量,但返回null(Unity3D),android,unity3d,augmented-reality,Android,Unity3d,Augmented Reality,我正在使用Unity增强现实。如果我调用其他类的公共值,为什么我的应用程序返回空值 这些是我的课程: using UnityEngine; using System.Collections; public class GUIControlScript : MonoBehaviour { public GUISkin MenuSkin; public Texture BoxBackground; public DefaultTrackableEventHandler DTEH; public

我正在使用Unity增强现实。如果我调用其他类的公共值,为什么我的应用程序返回空值

这些是我的课程:

using UnityEngine;
using System.Collections;

public class GUIControlScript : MonoBehaviour {

public GUISkin MenuSkin;
public Texture BoxBackground;
public DefaultTrackableEventHandler DTEH;
public string ttx;

void OnGUI(){
    Screen.orientation = ScreenOrientation.Landscape;
    GUI.skin = MenuSkin;
    GUI.Box(new Rect(0, 0, Screen.width, 600), BoxBackground);
    GUI.BeginGroup(new Rect(Screen.width / 2 - 150, Screen.height / 2 - 150, 300, 300));
    try
    {
        GUI.Button(new Rect(0, 0, 500, 500), ttx);
    }
    catch(System.Exception e)
    {

    }
    GUI.EndGroup();
}

void Update()
{
    ttx = DTEH.TrackableText; //This is the problem!
}
这是我调用变量的类

using UnityEngine;

public class DefaultTrackableEventHandler : MonoBehaviour,
                                        ITrackableEventHandler
{
#region PRIVATE_MEMBER_VARIABLES

private TrackableBehaviour mTrackableBehaviour;
public string TrackableText = "";

#endregion // PRIVATE_MEMBER_VARIABLES

#region UNTIY_MONOBEHAVIOUR_METHODS

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

    OnTrackingLost();
}

#endregion // UNTIY_MONOBEHAVIOUR_METHODS

#region PUBLIC_METHODS

// Implementation of the ITrackableEventHandler function called when the
// tracking state changes.
public void OnTrackableStateChanged(
                                TrackableBehaviour.Status previousStatus,
                                TrackableBehaviour.Status newStatus)
{
    if (newStatus == TrackableBehaviour.Status.DETECTED ||
        newStatus == TrackableBehaviour.Status.TRACKED)
    {
        OnTrackingFound();

    }
    else
    {
        OnTrackingLost();
    }
}

#endregion // PUBLIC_METHODS

#region PRIVATE_METHODS

private void OnTrackingFound()
{
    Renderer[] rendererComponents = GetComponentsInChildren<Renderer>();

    // Enable rendering:
    foreach (Renderer component in rendererComponents) {
        component.enabled = true;
    }
    if (mTrackableBehaviour.TrackableName.Equals("farmasi"))
    {
        TrackableText = "farmasi";
    }
    Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
}

private void OnTrackingLost()
{
    Renderer[] rendererComponents = GetComponentsInChildren<Renderer>();

    // Disable rendering:
    foreach (Renderer component in rendererComponents) {
        component.enabled = false;
    }

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

#endregion // PRIVATE_METHODS
使用UnityEngine;
公共类DefaultTrackableEventHandler:MonoBehavior,
ITrackableEventHandler
{
#区域私有成员变量
私人可追踪行为;
公共字符串TrackableText=“”;
#endregion//私有成员变量
#区域不连续法
void Start()
{
mtrackablebhavior=GetComponent();
if(MTrackableBehavior)
{
mtrackablebhavior.RegisterTrackableEventHandler(此);
}
OnTrackingLost();
}
#endregion//UNTIY\u monobhavior\u方法
#区域公共资源管理方法
//当
//跟踪状态更改。
公共无效OnTrackableStateChanged(
可跟踪行为。状态优先状态,
可跟踪的行为。状态(状态)
{
if(newStatus==trackablebehavior.Status.DETECTED||
newStatus==trackableBehavior.Status.TRACKED)
{
OnTrackingFound();
}
其他的
{
OnTrackingLost();
}
}
#endregion//PUBLIC\u方法
#区域私有方法
私有无效OnTrackingFound()
{
Renderer[]rendererComponents=GetComponentsInChildren();
//启用渲染:
foreach(渲染器组件中的渲染器组件){
component.enabled=true;
}
if(mtrackablebehavior.TrackableName.Equals(“farmasi”))
{
TrackableText=“farmasi”;
}
Debug.Log(“Trackable”+mtrackablebehavior.TrackableName+“found”);
}
私有无效OnTrackingLost()
{
Renderer[]rendererComponents=GetComponentsInChildren();
//禁用渲染:
foreach(渲染器组件中的渲染器组件){
component.enabled=false;
}
Debug.Log(“Trackable”+mtrackablebehavior.TrackableName+“lost”);
}
#endregion//PRIVATE\u方法

使用评论中的讨论,我们设法缩小了范围,以查看
null
到底是什么。您调用
public DefaultTrackableEventHandler DTEH;
,但从未启动它。请尝试在
GUIControlScript
-类中添加另一个函数,如下所示:

void Start()
{
    DTEH = new DefaultTrackableEventHandler();
}

这样,您不仅给了
DTEH
一个类型,而且还初始化了它。

因为您有
DefaultTrackableEventHandler
扩展
monobhavior
,所以需要将它附加到
GameObject
,以便对其进行初始化。您可以通过以下两种方式之一进行操作:

  • 在查看
    GUIControlScript
    附加到的
    GameObject
    的检查器中:通过单击
    addcomponent
    ,选择
    Scripts
    (或脚本所在的位置),手动将
    脚本添加到
    GameObject
    ,然后单击
    DefaultTrackableEventHandler
    。在代码中,您可以通过调用以下命令访问
    DefaultTrackableEventHandler
    脚本:


  • 您不必总是手动将
    组件
    添加到
    游戏对象
    本身。通常,如果您没有任何要在
    检查器
    中直接更改的公共变量,那么您可以通过编程方式添加
    组件

    您是否尝试过记录
    DTEH
    ll
    也可以吗?你能从
    DTEH
    访问
    Start()
    吗?如何操作..我是c#developer的新手..在
    GUIControlScript
    Update
    函数中添加以下行:
    Debug.Log(DTEH)
    通常,您的错误消息包含的是
    null
    的内容。它是
    DTEH
    ?它是
    ttx
    ?它是
    TrackableText
    ?哦,好的..我试着逐一跟踪。。
    public class GUIControlScript : MonoBehaviour {
        private DefaultTrackableEventHandler dteh;
    
        void Start() {
            dteh = GetComponent<DefaultTrackableEventHandler>();
        }
    }
    
    public class GUIControlScript : MonoBehaviour {
        private DefaultTrackableEventHandler dteh;
    
        void Start() {
            dteh = gameObject.AddComponent<DefaultTrackableEventHandler>();
        }
    }