【发布时间】:2016-06-01 10:15:13
【问题描述】:
我有两个“敌人”精灵,当“玩家”精灵接触时,应该会造成伤害。
PlayerStatus 脚本只保存有关玩家健康的信息。 当 EnemyAIController OnTriggerEnter2D 方法被触发时,我想调用 PlayerStatus 脚本中的一个方法,它将生命值减少 x 量。
我使用静态修饰符将 TakeDamage 方法访问器设为公开。所以我可以打电话给PlayerStatus.TakeDamage(float x),但这不起作用。
我收到错误:需要对象引用才能访问非静态成员 `PlayerStatus.TakeDamage(float)'
我不想使用findObjectByTag,因为我读过它很慢而且很懒惰。
我错过了什么吗?
PlayerStatus 脚本:
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);
}
}
【问题讨论】:
-
Jaka 已经解释了您的问题。但是请记住——拥有 STATIC CLASSES 并且只在该静态类中编写静态调用是一个非常好的主意。需要考虑的事情。
-
你在做什么是非常危险的 不要忘记 PlayerStatus 是一个 MonoBehavior。 *它附加到什么上?如果您的游戏中有多个 PlayerStatus 脚本会怎样?
-
哎呀。我可以在任何具体的地方阅读此内容吗?
-
感谢不祥的警告,然后没有进一步解释就离开了@JoeBlow
-
我已经输入了“如果您的游戏中有多个 PlayerStatus 脚本会怎样?”在 ECS 环境中使用静态方法几乎是毫无意义的,而且至少定义不明确。对于游戏引擎中的“健康”和“评分”(基本上是“全局”),只需使用静态类(当然还有静态方法)
标签: c# unity3d unityscript