В моей настольной игре очки даются путем бросания 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);
}
}
Итак, как я могу применить эти смоделированные данные к реальному игровому объекту на сцене?