2016-02-19 53 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

它仍然是一样的错误? –

相关问题