Unity3D заставляет объект заданной ориентации с минимальным искусственным эффектом - PullRequest
0 голосов
/ 06 декабря 2018

В моей настольной игре очки даются путем бросания 7 морских раковин карие ракушки .Эти снаряды сбрасываются на сферу в Unity, поэтому они случайно переворачиваются в разные места.Как только rigidbody.isSleeping() вернет true, я делаю Raycast (со стороны живота вниз), чтобы выяснить ориентацию раковины.Если это НЕ удар, мы знаем, что живот снарядов перевернут, что означает очко.

Все хорошо и очень реалистично в режиме одиночной игры.Причина в том, что я просто активирую гравитацию снарядов, и они падают на сферу, меняют случайным образом, и когда меня останавливают, я получаю метки, как указано выше.

Теперь проблема в том, что я делаю игру многопользовательской.В этом случае я отправил случайно сгенерированные метки с сервера, и клиенту придется анимировать оболочки для представления меток.Например, если сервер отправит 3 из 7 оболочек, то у 3 должен быть перевернутый живот.

Попытка сделать это была для меня серьезной проблемой.Я пытался transform.Rotate(), когда скорость уменьшалась, но это было не очень надежно и иногда сводило с ума.Вращение после rigidbody.isSleeping() работает, но очень нереально.

Я знаю, что я пытаюсь бросить вызов физике здесь, но могут быть некоторые способы достичь того, чего я хочу, с минимальным искусственным эффектом.

Я на самом деленужны идеи.


Обновление - 1

После получения информации ниже я нашел некоторую информацию здесь , некоторые продвинутые вещи здесь .Поскольку у последней ссылки были некоторые продвинутые вещи, я хотел начать с малого.Поэтому я перешел по первой ссылке и выполнил тест ниже.

Я записал положение, вращение и скорость морской раковины с включенной автосимуляцией и записал их в файл.Затем я использовал Physics.Simulate () для того же сценария и зарегистрировал его.

Сравнение двух говорит мне, что данные в обоих случаях похожи.Похоже, для моих требований мне нужно смоделировать падение морской раковины и затем применить эту последовательность к реальному объекту.

Теперь моя проблема в том, как я могу применить результаты физики (), вращение, скорость и т. Д.) К реальной морской раковине, чтобы можно было увидеть анимацию.Если я установлю позиции для моего игрового объекта в цикле симуляции, то ничего не произойдет.

    public void Simulate()
{


    rbdy = GetComponent<Rigidbody>();
    rbdy.AddForce(new Vector3(0f, 0f, 10f));
    rbdy.useGravity = true;
    rbdy.mass = 1f;

    //Simulate where it will be in 5 seconds
    int i = 0;

    while (simulateTime >= Time.fixedDeltaTime)
    {
        simulateTime -= Time.fixedDeltaTime;

        Debug.Log($"position: {rbdy.position.ToString()} rotation: {rbdy.rotation.ToString()} Velocity {rbdy.velocity.magnitude}");

        gameObject.transform.position = rbdy.position;

        Physics.Simulate(Time.fixedDeltaTime);
    }
}

Итак, как я могу применить эти смоделированные данные к реальному игровому объекту на сцене?

1 Ответ

0 голосов
/ 06 декабря 2018
  1. Предположим, что физика является детерминированной, просто установите скорость и положение и позвольте ей моделироваться на каждом клиенте.Вывод должен быть таким же.Если выходные данные немного отличаются, вы можете отрегулировать их, и они могут быть едва заметны.

  2. Physics.simulate может быть интересно прочитать, даже если этопротивоположность того, что вы хотите.

  3. Вы можете добавить в клиента записать шаги в режиме реального времени или с использованием phys.simulate (см. Пункт 2) и передать данные анимации в двоичном виде - затем использоватьэто в других клиентах для воспроизведения анимации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...