2016-04-25 8 views
1

Ich habe versucht, dieses Problem seit vielen Stunden jetzt zu lösen, aber ich kann es einfach nicht herausfinden.Unity3d C# Versuch, auf Array im Skript aber in void zuzugreifen

Ich muss auf das Array "Buchstaben in den Lücken" nextItem "und" prevItem "zugreifen, aber ich bekomme eine Fehlermeldung" ArgumentException: GetComponent erfordert, dass die angeforderte Komponente 'GameObject []' von MonoBehaviour oder Komponente abgeleitet ist oder ist eine Schnittstelle.“

using UnityEngine; 
using System.Collections; 

public class buttons_abc : MonoBehaviour { 
public int id; 
public GameObject[] letters; 

// Use this for initialization 
void Start() { 
    id = 0; 
    GameObject[] letters = GameObject.FindGameObjectsWithTag ("letter"); 
    letters[id].SetActive (true); 
    for (int i = 1; i < 32; i++) { 
     letters[i].SetActive (false); 
    } 

} 
public void nextItem(){ 
    letters = GetComponent<GameObject[]>(); 
    Debug.Log (id); 
    if(id < 32){ 
     letters[id].SetActive (false); 
     letters[id + 1].SetActive (true); 
     id++; 
    } else { 
     Debug.Log("viimane t2ht"); 
    } 
} 
public void prevItem(){ 
    letters = GetComponent<GameObject[]>(); 
    Debug.Log (id); 
     if(id > 0){ 

      letters[id].SetActive(false); 
      letters[id-1].SetActive(true); 
      id--; 
     } else{ 
      Debug.Log("esimene t2ht"); 
     } 

} }

Antwort

0

Es gibt ein paar Fehler in Ihrem Skript.
1. Es gibt keine GetComponent, die eine GameObject jemals zurückkehren können. Period. Die GetComponent Funktion ein bekommen verwendet wird EINZELNE KOMPONENTE nicht an ein GameObject angehängt.
2. Das heißt, GetComponent kann Arrays auch nicht zurückgeben. Der von Ihnen gesuchte Typ GetComponent<GameObject[]> ist ungültig. Gültige GetComponents Anrufe so aussehen

GetComponent<AudioSource>(); 
  1. Sie haben ein globales Array von Gameobjects letters genannt. Sie erstellen dann ein ANDERES Array in Start, dieses Mal lokal, und rufen dasselbe auf (letters).

es Putting alle zusammen

using UnityEngine; 
using System.Collections; 

public class buttons_abc : MonoBehaviour { 
public int id; 
public GameObject[] letters; 

// Use this for initialization 
void Start() { 
    id = 0; 
    //Already declared letters globally. Creating another one here locally will mean that your global array will not be populated 
    //GameObject[] letters = GameObject.FindGameObjectsWithTag ("letter"); 
    letters = GameObject.FindGameObjectsWithTag ("letter"); 
    letters[id].SetActive (true); 
    for (int i = 1; i < 32; i++) { 
     letters[i].SetActive (false); 
    } 

} 
public void nextItem(){ 
    //GetComponent only works on Components. GameObjects are NEVER components 
    //GetComponent cannot return an array 
    //letters = GetComponent<GameObject[]>(); 
    Debug.Log (id); 
    if(id < 32){ 
     letters[id].SetActive (false); 
     letters[id + 1].SetActive (true); 
     id++; 
    } else { 
     Debug.Log("viimane t2ht"); 
    } 
} 
public void prevItem(){ 
    //See comment from nextItem() 
    //letters = GetComponent<GameObject[]>(); 
    Debug.Log (id); 
     if(id > 0){ 

      letters[id].SetActive(false); 
      letters[id-1].SetActive(true); 
      id--; 
     } else{ 
      Debug.Log("esimene t2ht"); 
     } 
} } 
+0

Vielen Dank, wenn ich es nicht doppelt erklärt hätte, hätte ich keine Probleme. Ich habe nach dem ersten Fehler mit der getComponent herumgespielt. Aber es ist jetzt behoben, danke :) –

1

Zu viele falsche Dinge in Ihrem Code.

  1. Gameobject Deklarieren genannt letters dann in der Start() Funktion wieder neu zu deklarieren.

  2. letters = GetComponent<GameObject[]>(); Die aktuelle GameObject-Referenz überschrieben?

  3. GetComponent<GameObject[]>(); Sie können dies nicht tun. (Ihr Hauptfehler)

  4. 4.

for (int i = 1; i < 32; i++) { letters[i].SetActive (false); }

Sie haben keine Möglichkeit zu überprüfen, ob Ihr Array aus gebunden ist. i< 32 sollte letters.Length sein