如何正确检测玩家何时可以从上方压倒敌人?

时间:2019-03-20 18:52:41

标签: unity3d

这个问题比看起来要复杂得多,这就是原因。

我有一个播放器,并且在2D + 3D世界中启用了物理。

这些怪物具有正弦运动=他们从右到左上下移动。 播放器只能或多或少地跳得很高,但是不能左右移动(就像没有互联网连接时Chrome上的恐龙游戏)。

在多次尝试检测玩家是否在上方之后(不是简单地if (PlayerY - MonsterY) > 0,否则我不会在这里问到),我想出的最好的主意是在怪物中制造两个对撞机:一个用于“ head”和“ body”之一。

  • 当玩家只击打头部时,它只能在上方(否则首先是身体),所以这是一个简单的情况
  • 当玩家只击打身体时,它只能在下面或侧面,所以这也是一个容易的情况
  • 有时候,玩家碰到了两个对撞机。

所以我想在FixedUpdate计算之后检查这个

如果您读过execution order of the callback functions,就没有LateFixedUpdate:即使有LateUpdate,也已正式写明开发人员应该在FixedUpdate中处理物理,并且没有其他地方

到目前为止,我所做的是:调用怪物头的OnCollision时,只需更改一个布尔值,对怪物体OnCollision进行更改即可。因此,在OnCollisionXXX(如文档所述)之后,您只能使用一件事:yield WaitForFixedUpdate

我想检查这些布尔值,并根据它们在yield WaitForFixedUpdate中的值进行操作。

关于如何执行此操作,我在网上找不到任何有价值的示例。知道在这种情况下如何实现yield WaitForFixedUpdate吗?我被卡住了。

1 个答案:

答案 0 :(得分:1)

问题

  

如何实现收益WaitForFixedUpdate

Coroutine内部使用yield

yield类似于“在此处中断例程,渲染当前帧,然后在下一帧从此处继续。”

例如

private void Start()
{
    // Start the routine once
    StartCoroutine(LateFixedUpdate());
}

private IEnumerator LateFixedUpdate()
{
    // looks scary but is okey in a Coroutine 
    // as long as you yield somewhere inside of the loop
    while(true)
    {
        // Continue after all FixedUpdate has been called on all scripts
        yield return new WaitForFixedUpdate();

        // do something
    }
}