【问题标题】:Unable to call public static method in other unity script无法在其他统一脚本中调用公共静态方法
【发布时间】: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


【解决方案1】:

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

    }

}

【讨论】:

  • 能否请您仔细检查一下公共静态浮动健康 = 3.0f 中是否有 STATIC 关键字; (可能忘记在我的答案的第一次修订中添加它),否则我没有想法。会想更多。
  • 这是这个问题的答案。所以我把它标记为这样。有些人似乎认为这是一种不恰当的做法......您的里程可能会有所不同。
  • 如果它符合您的代码和模式,那么它就是正确的做法:)。否则我通常喜欢避免使用静态方法,尤其是在这种情况下,单例可能更合适。
  • Unity 中有 no 单例 - MonoBehaviors 不能真正成为单例,它们仅作为“附加”到 GameObject 的组件才有意义。 unity是“ECS”en.wikipedia.org/wiki/Entity_component_system,一个游戏引擎(基于帧和基于场景)不是普通的OO
  • “如果它符合你的代码和模式,那就是正确的做法”不,不是在 ECS 中。考虑一下,某处有一个特定的GameObject,并附有一个特定的PlayerStatus。好的,所以在 Unity 中,你有一个附加到游戏对象的组件 - 就像其他所有东西一样。假设您想从其他脚本访问它。你知道怎么做 - 拖动检查器变量或在唤醒时“查找”它。完全没有什么大不了的,以及团结是如何运作的。如果您考虑一下您正在尝试做的所有事情就是绕过该普通过程以使其在语法上更容易。这是一个非首发
猜你喜欢
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多