Как правильно определить, когда игрок может сокрушить врага сверху? - PullRequest
0 голосов
/ 20 марта 2019

Этот вопрос гораздо сложнее, чем кажется, вот почему.

У меня есть игрок и физика включена в мире 2D + 3D.

У монстров синусоидальное движение = они идут вверх и вниз, справа налево. Игрок может прыгать только более или менее высоко, но не может двигаться вправо или влево (как игра в динозавр в Chrome, когда нет подключения к Интернету).

После многих неудачных попыток определить, находится ли игрок выше (это не просто if (PlayerY - MonsterY) > 0 в противном случае я бы не стал спрашивать здесь), лучшая идея, которую я придумал, - сделать два коллайдера в монстре: один для " head "и один для" body ".

  • Когда игрок бьет только головой, он может быть только выше (в противном случае это сначала тело), ​​так что это простая ситуация
  • Когда игрок ударяет только по корпусу, он может находиться только ниже или по бокам, поэтому это тоже легкая ситуация
  • иногда, случается, что игрок поражает оба коллайдера.

Так что я бы хотел проверить это после FixedUpdate вычислений.

Если вы прочитали порядок выполнения функций обратного вызова , LateFixedUpdate нет: даже если есть LateUpdate, официально написано, что разработчик должен обрабатывать физику в FixedUpdate, и больше нигде .

То, что я сделал до сих пор: когда вызывается OnCollision головы монстра, просто измените логическое значение, и то же самое для OnCollision тела монстра. Поэтому после OnCollisionXXX, как сказано в документации, вы можете использовать только одну вещь: yield WaitForFixedUpdate.

Я бы хотел проверить эти логические значения и действовать в соответствии с их значениями в yield WaitForFixedUpdate.

Я не могу найти в сети ценный пример того, как это сделать. Есть идеи, как реализовать yield WaitForFixedUpdate в этой ситуации? Я застрял.

1 Ответ

1 голос
/ 20 марта 2019

К вопросу

как реализовать yield WaitForFixedUpdate

yield предназначен для использования внутри Coroutine

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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...