无法在其他统一脚本中调用 public 静态方法

Unable to call public static method in other unity script

我有两个 "enemy" 精灵,当 "player" 精灵接触时,应该会造成伤害。

PlayerStatus 脚本仅包含有关玩家健康状况的信息。 当 EnemyAIController OnTriggerEnter2D 方法被触发时,我想在 PlayerStatus 脚本中调用一个方法,将生命值减少 x 量。

我使用静态修饰符制作了 TakeDamage 方法访问器 public。所以我可以调用 PlayerStatus.TakeDamage(float x),但这不起作用。

我收到错误:需要对象引用才能访问非静态成员`PlayerStatus.TakeDamage(float)'

我不想使用 findObjectByTag,因为我读到它很慢而且是一种懒惰的方式。

我是不是漏掉了什么?

玩家状态脚本:

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

    }

}

问题在 class PlayerStatus 内。在静态方法 TakeDamage 中,您正在访问非静态变量 health,这当然无法完成。

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

应该可以帮你解决错误。

否则,我建议您创建一个非静态方法 TakeDamage,使用 findObjectByTag,并且您可以在构造函数中执行一次(以避免性能损失)。只需将结果保存在 class 属性 中,您可以在 `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);

    }

}