2013-04-08 41 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