【问题标题】:Why isn't my definition for OnCollisionEnter() being used?为什么没有使用我对 OnCollisionEnter() 的定义?
【发布时间】:2016-03-09 17:12:39
【问题描述】:

我有一个角色,它是一个布尔标志,它决定了他是否在跳跃(如果他在跳跃,他就不能再跳跃了)。当他跳跃时,跳跃标志被设置为真,当他与某物碰撞时,它被设置回假(这样他就可以再次跳跃)。

但是,他只跳跃一次,即使应该重置为 false,跳跃也会保持真实。为什么会这样?我对OnCollisionEnter() 的定义应该是重置标志。

var trump;
var jump = false;

function Start() {
// Assigns the Rigidbody to a variable
trump = GetComponent(Rigidbody2D);
// Variable Switches:

}

function OnCollisionEnter() {
    jump = false;
    trump.velocity.y = 0;
    trump.velocity.x = 0;
}

function FixedUpdate() {
    trump.velocity.x = Input.GetAxis("Horizontal") * 10;
    if ((Input.GetKeyDown(KeyCode.UpArrow)) && (jump == false)) {
        trump.AddForce(Vector2(0, 10), ForceMode2D.Impulse);
        jump = true;
    }
}

编辑:根据给出的答案,我尝试将Collision 参数添加到OnCollisionEnter(),但在我添加Debug.Log() 后,它看起来仍然没有被调用在里面检查。还有什么问题吗?

function OnCollisionEnter(collision: Collision) {
    jump = false;
    Debug.log("He Hit The Wall");
    trump.velocity.y = 0;
    trump.velocity.x = 0;
}

【问题讨论】:

  • 是特朗普。他不让其他人告诉他该做什么:-p - 不过说真的,Why won't Trump jump more than once? 是迄今为止我见过的最有趣和最疯狂的问题标题 ;-)
  • 这个原因引起了我的注意。 XP 但我真的很想编辑标题以成为未来更有用/可搜索的问题......
  • @serlite - 每当您看到要进行的编辑时,始终只需单击编辑
  • @Number1son100 - 你不能使用“unityscript”。它已被弃用,不起作用,并且正在从 Unity 中删除。幸运的是,c# 要容易得多。

标签: unity3d physics unityscript unity3d-2dtools


【解决方案1】:

OnCollisionEnter() 的函数签名不正确。在定义这些特定于 MonoBehaviour 的函数时,函数的名称和参数必须与文档中显示的匹配。否则,MonoBehaviour 将无法识别它们,并且不会按预期调用该函数。

在这种情况下,OnCollisionEnter() 需要一个 Collision 参数:

function OnCollisionEnter(collision: Collision) {
    jump = false;
    trump.velocity.y = 0;
    trump.velocity.x = 0;
}

注意:以上内容是在编辑问题以实施建议之前编写的 - 之前,OnCollisionEnter() 是在没有参数的情况下定义的。

但是,在您的情况下,这不是唯一的问题 - 您正在使用 Unity 的 2D 物理,这意味着您实际上应该使用该函数的 2D 变体:OnCollisionEnter2D,它也采用稍微不同的参数Collision2D

所以你需要:

function OnCollisionEnter2D(collision: Collision2D) {
    jump = false;
    trump.velocity.y = 0;
    trump.velocity.x = 0;
}

希望这会有所帮助!如果您有任何问题,请告诉我。

【讨论】:

  • 我该如何解决这个问题?
  • @Number1son100 嘿,我仔细研究了你的问题,你是对的,还有其他问题。我已经更新了我的答案以反映这一点,请告诉我进展如何。
  • 你要二段跳吗?
  • 谢谢!不过我该怎么做呢?
  • @Number1son100 很高兴我能帮上忙!我将尝试回答 Barış - 在二段跳的情况下,您只需要稍微改变您的逻辑以使用计数器(如 var jumpsRemaining = 2)来跟踪跳跃,而不是布尔标志。仅当jumpsRemaining > 1 时才允许跳跃,并且在随后的每次跳跃中都减去 1。然后,当您与某物发生碰撞时,将其重置为所需的跳跃次数(如 2 次)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
相关资源
最近更新 更多