2014-01-18 52 views
0

謝謝大家!問題是我使用GetComponents而不是GetComponent,謝謝!C#(Unity 4.3)不能隱式地將類型`ShotScript []'轉換爲`ShotScript'

我對編程相當陌生,我試圖在Unity中製作2D遊戲。我在網上找到了一個非常好的教程,直到一點(Tut可以在這裏找到http://pixelnest.io/tutorials/2d-game-unity/shooting-1/)。我遇到了一個錯誤,無法弄清楚原因。當我嘗試在當前腳本中使用另一個腳本時(如果這對任何人有意義),都會發生錯誤。有問題的兩個腳本的名稱爲ShotScript和HealthScript和它們低於

ShotScript:

using UnityEngine; 
using System.Collections; 

public class ShotScript : MonoBehaviour { 


public int damage = 1; 

public bool isEnemyShot = false; 

void Start() { 

    Destroy (gameObject, 20); 
} 



} 

HealthScript:

using UnityEngine; 
using System.Collections; 

public class NewBehaviourScript : MonoBehaviour { 


public int hp = 2; 

public bool isEnemy = true; 

void OnTriggerEnter2D(Collider2D Collider) { 

     ShotScript shot = collider.gameObject.GetComponents<ShotScript>(); 
      if (shot != null) { 
        if (shot.isEnemyShot != isEnemy) { 
          hp -= shot.damage; 
          Destroy (shot.gameObject); 

          if (hp <= 0) { 
            Destroy(gameObject); 
          } 
        } 
      } 
    } 


} 

我得到的錯誤是: 「資產/腳本/ HealthScript .cs(13,36):錯誤CS0029:無法隱式轉換類型ShotScript[]' to ShotScript'「

我比較卡住,所以我任何人都可以指向我正確的方向,這將是偉大=)

PS我是新來這個問問題的事情,所以如果你需要任何額外的信息,我會盡我所能提供它

+0

它意味着它說什麼。我假設問題出現在'ShotScript shot = collider.gameObject.GetComponents ();''GetComponents'方法是否返回一個數組? –

+0

是的,我應該輸入GetComponent = P – Swindy

回答

2

你打電話GetComponents(注意複數形式),返回類型的所有匹配元件的在那個特定的GameObject數組(即ShotScript[]) 。

因此,這試圖將一個ShotScript[]數組分配到一個不可能的單個ShotScript實例中。

如果你想檢索只有一個ShotScript(因爲你打算在只有1個對象上),使用GetComponent(注意單數)方法,而不是如果沒有被分配將返回只有一個實例或null

於是一行改成這樣:

ShotScript shot = collider.gameObject.GetComponent<ShotScript>(); 

如果你的目的是爲了處理在同一GameObject許多ShotScript實例/組件,使用Jon Skeet's answer提供的固定/代碼。

0

該錯誤消息說,13號線是錯誤的:

ShotScript shot = collider.gameObject.GetComponents<ShotScript>(); 

它看起來像GetComponents方法返回一個數組ShotScript[],但你要含蓄投它只是一個單一的ShotScript實例。嘗試:

ShotScript[] shots = collider.gameObject.GetComponents<ShotScript>(); 
+0

感謝您的幫助! – Swindy

3

嗯,這就是問題所在:

ShotScript shot = collider.gameObject.GetComponents<ShotScript>(); 

這聽起來像GetComponents<ShotScript>是返回一個陣列ShotScript引用,即它的返回類型爲ShotScript

你想對每個ShotScript採取相同的行動嗎?如果是這樣,你可能只想使用一個foreach循環...儘管你可能只想檢查hp最後變爲負數。我希望你能刪除支票無效,也假定GetComponents只會返回一個空數組,如果沒有任何這樣的組件:

ShotScript[] shots = collider.gameObject.GetComponents<ShotScript>(); 
foreach (ShotScript shot in shots) 
{ 
    if (shot.isEnemyShot != isEnemy) 
    { 
     hp -= shot.damage; 
     Destroy(shot.gameObject); 
    } 
} 
if (hp <= 0) 
{ 
    Destroy(gameObject); 
} 

(我已經重新格式化那是相當更傳統的C#,當然你可以使用任何你想要的壓痕。)

+0

非常感謝!你確實是對的! – Swindy

相關問題