2016-04-25 70 views
1

我一直試圖解決這個問題現在好幾個小時,但我只是不知道。我得到一個錯誤說:「ArgumentException:GetComponent要求請求的組件'GameObject []'從MonoBehaviour或組件派生或是一個接口。」Unity3d C#試圖訪問腳本中的數組,但在無效

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"); 
     } 

} }

回答

0

有你的腳本的一些錯誤。
1.有沒有GetComponent可以返回一個GameObject如初。時期,GetComponent功能是用於獲取單組分nt附加到一個GameObject。
2.也就是說,GetComponent也不能返回數組。您正在尋找的類型GetComponent<GameObject[]>無效。有效GetComponents調用這個樣子

GetComponent<AudioSource>(); 
  • 你有GameObjects的全局數組稱爲letters。然後,您在本地創建另一個陣列,將其稱爲同一事物(letters)。
  • 全部放在一起

    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

    非常感謝,如果我沒有雙倍宣佈它在第一位,我不會有任何問題。第一個錯誤發生後,我開始搞亂getComponent。但它現在已經修復,謝謝:) –

    1

    太多錯誤的東西在你的代碼。

    1. 聲明遊戲對象命名letters然後再重新宣佈它在Start()功能。

    2. letters = GetComponent<GameObject[]>();覆蓋當前的GameObject參考?

    3. GetComponent<GameObject[]>();你不能做到這一點。(你的主要錯誤)

    4. 4.

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

    你有沒有辦法來檢查,如果你的數組越界。 i< 32應該是letters.Length

    相關問題