无法在其他统一脚本中调用 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);
}
}
我有两个 "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);
}
}