2016-05-17 56 views
0

我試圖創建多個引用稱爲Ball對象,這樣就會出現在屏幕上多個球的時候,是時候採取這樣的行動實例化對象的特定對象。但是,我似乎無法弄清楚如何做到這一點。這裏是我正在試圖做到這一點:問題統一

private GameObject reference; 
private Ball[] ballArray; 
void Start() { 
    reference = GameObject.FindGameObjectWithTag("ball"); 
    ballArray = new Ball[amountOfBalls - 1]; 
    start = false; 

    for (int i = 0; i < ballArray.Length + 1; i++) 
    { 
     ballArray[i] = Instantiate(reference); 
     print("Initialized: " + (i + 1) + " times."); 

    } 


} 

當我這樣做,我得到以下錯誤

Cannot implicitly convert type 'UnityEngine.GameObject' to 'Ball'

但是,如果我改變的ballArray類型Object它的工作原理,並拋出沒有錯誤,但是如果它的類型爲Object,我不能訪問Ball的方法。我需要這些方法。

問題:如何使這項工作仍然可以訪問我的Ball類方法?

下面是一個例子來進一步明確什麼,我需要能夠做到

void Update() { 
    for (int i = 0; i < ballArray.Length + 1; i++) { 

     if (ballArray[i].isOffScreen()) { 
      print("Ball #" + (i+1) + " is off screen"); 
     } 

    } 

} 

我需要能夠從Ball類訪問isOffScreen方法。

在先進的感謝您的幫助!

+0

'ballArray [i] = new Ball()'有什麼問題;'? – Idos

+0

@Idos號。如果你的班級繼承了Monobehaviour,你就無法做到這一點。 – Programmer

回答

2

實例化和存儲遊戲對象的臨時遊戲物體,然後使用GetComponent獲得連接到它那個球的腳本的實例。

for (int i = 0; i < ballArray.Length; i++) 
{ 
    GameObject tempObj = (GameObject)Instantiate(reference); 
    ballArray[i] = tempObj.GetComponent<Ball>(); 
} 

這解決了

不能鍵入 'UnityEngine.GameObject' 隱式轉換爲 '球'

錯誤。

你已經在你的最後一個問題得到糾正。請停止這樣做:ballArray = new Ball[amountOfBalls - 1];。簡單做ballArray = new Ball[amountOfBalls];

爲了您的更新代碼,使用下面的代碼:

void Update() { 
    for (int i = 0; i < ballArray.Length; i++) 
    { 
     if (ballArray[i].isOffScreen()) { 
      print("Ball #" + (i+1) + " is off screen"); 
     } 
    } 
} 

注意,我從兩個代碼塊取出所有的for (int i = 0; i < ballArray.Length + 1; i++)for (int i = 0; i < ballArray.Length; i++)取而代之。這是做到這一點的正確方法。

+0

同樣的錯誤,當我這樣做 – Luke

+0

@Luke更新了我的答案。 – Programmer

+0

耶穌,你要多少次救我。非常好,正是我需要的。完美的工作。 – Luke

1

你可以改變ballArray的數據類型來

List<GameObject> ballArray = new List<GameObject>(); 

所以調用isOffScreen方法,

ballArray[i].getComponent<Ball>().isOffScreen() 

更新

最終結果

private GameObject reference; 
private List<GameObject> ballArray; 
void Start() 
{ 
    reference = GameObject.FindGameObjectWithTag("ball"); 
    ballArray = new List<GameObject>(); 
    start = false; 

    for (int i = 0; i < amountOfBalls; i++) 
    { 
     ballArray.Add(Instantiate(reference)); 
     print("Initialized: " + (i + 1) + " times."); 

     if (ballArray[i].GetComponent<Ball>().IsOffScreen()) 
     { 
      print("Ball #" + (i + 1) + " is off screen"); 
     } 
    } 


} 
+0

非常好。謝謝您的意見。 – Luke

+0

@CloudSL你不應該''ballArray [i] = ballArray [i] .getComponent ().isOffScreen()'沒有初始化''''''''''''''。你會得到'Null Exception'錯誤。你必須做'ballArray [i] .getComponent ()'然後在訪問'isOffScreen()'之前將它分配給'ballArray [i]'。例如'ballArray [i] = ballArray [i] .getComponent ()'。現在你可以做'ballArray [i] .isOffScreen()'或'ballArray [i] = ballArray [i] .getComponent ().isOffScreen()'如果你喜歡冗餘。 – Programmer

+1

啊是的謝謝@Programmer – CloudSL