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

本文关键字:调用 静态方法 脚本 其他 | 更新日期: 2023-09-27 18:35:28

我有两个"敌人"精灵,当"玩家"精灵触摸时,应该会造成伤害。

玩家

状态脚本仅保存有关玩家健康状况的信息。当 EnemyAIController OnTriggerEnter2D 方法被触发时,我想在 PlayerStatus 脚本中调用一个方法,该方法会将生命值降低 x 量。

我使用静态修饰符公开了 TakeDamage 方法访问器。所以我可以打电话给PlayerStatus.TakeDamage(float x),但这不起作用。

我收到错误:需要对象引用才能访问非静态成员"玩家状态.TakeDamage(float)"

我不想使用findObjectByTag因为我读过这种缓慢且懒惰的方式。

我错过了什么吗?

玩家状态脚本:

public class PlayerStatus : MonoBehaviour {
    public float health = 3.0f;
    public static void TakeDamage(float damage){
        health -= damage;
    }
}

敌人AIController脚本:

public class EnemyAIController : MonoBehaviour {
    void OnTriggerEnter2D(Collider2D other) {
            Debug.Log("Reduce Player Health"); 
            PlayerStatus.TakeDamage (1.0f);
    }
}

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

问题出在类 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);
    }
}