我有两个“敌人”精灵,当“玩家”精灵接触时,应该造成伤害。
PlayerStatus脚本只保存有关玩家健康状况的信息。 当触发EnemyAIController OnTriggerEnter2D方法时,我想在PlayerStatus脚本中调用一个方法,该方法会将健康状况减少x个数量。
我使用static修饰符将 TakeDamage 方法访问器公开。所以我可以致电$order_list
,但这不起作用。
我收到错误: 访问非静态成员`PlayerStatus.TakeDamage(float)'
需要对象引用我不想使用PlayerStatus.TakeDamage(float x)
,因为我读过这个很慢而且懒惰的做法。
我错过了什么吗?
PlayerStatus脚本:
findObjectByTag
EnemyAIController脚本:
public class PlayerStatus : MonoBehaviour {
public float health = 3.0f;
public static void TakeDamage(float damage){
health -= damage;
}
}
答案 0 :(得分:3)
问题出在班级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);
}
}