2013-04-08 37 views
0

我正在使用Unity增强现实。为什么我的应用程序返回空值,如果我调用其他类的公共值?C#调用其他类变量但返回null(Unity3D)

这些都是我的课:

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 
+0

您是否尝试过记录'DTEH'?那是'null'吗?你能从'DTEH'开始启动()吗? – Joetjah 2013-04-08 07:50:49

+0

该怎么做..? im new new in c#developer .. – NoobAndroidDev 2013-04-08 07:53:46

+0

在'GUIControlScript'的'Update'函数中添加以下代码行:'Debug.Log(DTEH);' – Joetjah 2013-04-08 07:56:07

回答

1

在评论中使用的讨论课上,我们设法缩小它,看看有什么完全是null。你打电话public DefaultTrackableEventHandler DTEH;,但你永远不会启动它。尝试添加其他功能在您的GUIControlScript -class是这样的:

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

这样的话,你没有只给DTEH一个类型,但你初始化它。

1

既然你有DefaultTrackableEventHandler延伸MonoBehaviour,它需要附加到一个GameObject为了它初始化。您可以通过以下两种方式之一进行:

  1. 在巡视查看GameObjectGUIControlScript连接到:通过点击Add Component,选择Scripts手动添加ScriptGameObject(或任何你的脚本所在) ,然后点击DefaultTrackableEventHandler。在代码中,你就可以通过调用GetComponent访问DefaultTrackableEventHandler脚本:

    public class GUIControlScript : MonoBehaviour { 
        private DefaultTrackableEventHandler dteh; 
    
        void Start() { 
         dteh = GetComponent<DefaultTrackableEventHandler>(); 
        } 
    } 
    
  2. GUIControlScript脚本,调用AddComponentDefaultTrackableEventHandler脚本编程方式添加到GameObject

    public class GUIControlScript : MonoBehaviour { 
        private DefaultTrackableEventHandler dteh; 
    
        void Start() { 
         dteh = gameObject.AddComponent<DefaultTrackableEventHandler>(); 
        } 
    } 
    

您并不总是必须手动将Component添加到GameObject本身。通常,如果您没有任何要在Inspector中直接更改的公共变量,则可以通过编程方式添加Component