无法在其他统一脚本中调用公共静态方法
本文关键字:调用 静态方法 脚本 其他 | 更新日期: 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);
}
}