2016-02-19 56 views
0

我有兩個「敵人」精靈,當「玩家」精靈接觸時,應該會造成傷害。無法在其他統一腳本中調用公共靜態方法

PlayerStatus腳本只保存有關玩家健康的信息。 當EnemyAIController的OnTriggerEnter2D方法被觸發時,我想調用PlayerStatus腳本中的一個方法,這個方法會減少x的健康度。

我製作了TakeDamage method accessor public with a static modifier。所以我可以打電話PlayerStatus.TakeDamage(float x),但這不起作用。

我得到的錯誤:訪問對象引用需要非靜態成員`PlayerStatus.TakeDamage(浮動)」

我不想使用findObjectByTag因爲我已閱讀,是緩慢而懶散的做法。

我錯過了什麼嗎?

PlayerStatus腳本:

public class PlayerStatus : MonoBehaviour { 

    public float health = 3.0f; 

    public static void TakeDamage(float damage){ 
     health -= damage; 

    } 

} 

EnemyAIController腳本:

public class EnemyAIController : MonoBehaviour { 

    void OnTriggerEnter2D(Collider2D other) { 

      Debug.Log("Reduce Player Health"); 
      PlayerStatus.TakeDamage (1.0f); 

    } 

} 
+0

賈卡解釋你的問題。但請記住 - 擁有STATIC *** CLASSES ***並且只在靜態類中寫入靜態調用是非常好的主意。需要考慮的事情。 – Fattie

+0

**你正在做的事情極其危險**不要忘記PlayerStatus是一個單身行爲。 ***附件是什麼?**如果您的遊戲中有多個PlayerStatus腳本,會發生什麼情況? – Fattie

+0

哎呀。我可以在任何地方閱讀這篇文章? –

回答

3

問題是PlayerStatus類中。內部靜態方法TakeDamage您正在訪問非靜態變量health這當然不能完成。

public static float health = 3.0f; // inside class PlayerStatus 

應該幫助您解決錯誤。否則,我建議您創建一個非靜態方法TakeDamage,使用findObjectByTag,並且您可以在構造函數中執行一次(以避免性能損失)。只需將結果保存在類屬性,在這裏你訪問它裏面`OnTriggerEnter2D:

(更多的是僞代碼)

public class EnemyAIController : MonoBehaviour { 

    private PlayerStatus _player; 

    public EnemyAIController() { 
     // call base() if neccessery 
     _player = findObjectByTag("your player"); 
    } 

    void OnTriggerEnter2D(Collider2D other) { 

      Debug.Log("Reduce Player Health"); 
      this._player.TakeDamage (1.0f); 

    } 

} 
+0

好抓住..... –

+0

向健康添加靜態並沒有修復問題.. –

+0

它仍然是一樣的錯誤? –

相關問題