Я пытаюсь сделать игру, в которой вы отскакиваете мячом вверх и вниз по платформе. Я добавил к шару компонент твердого тела, сделав шар «Use Gravity», а также имел материал в SphereCollider, чтобы он имел «подпрыгиваемость» или коэффициент восстановления. Мяч красиво и стильно следует гравитации на неподвижной платформе / самолете.
После я попытался добавить компонент платформы. Этот компонент, кстати, просто перемещается вверх и вниз по оси Y (как будто кто-то просто подбрасывает шарик для пинг-понга вверх и вниз по веслу). Чтобы заставить его подняться, я использовал этот сценарий C #.
if (Input.GetKeyDown(KeyCode.W))
{
heldDownW = true;
}
if (Input.GetKeyUp(KeyCode.W))
{
heldDownW = false;
}
if (heldDownW)
{
transform.position = new Vector3(transform.position.x, (transform.position.y + 1f), transform.position.z);
}
Это просто проверяет, удерживается ли клавиша W. Поднимите платформу. У меня то же самое и с нажатой клавишей S. Компонент перемещения платформы работает хорошо. Однако вот моя проблема. Мяч отлично работает на неподвижной платформе или когда я не нажимаю клавишу W или S. Он подпрыгивает и подчиняется силе тяжести. Однако, когда я перемещаю платформу, когда мяч находится в движении, мяч проходит прямо через платформу.
Думаю, я знаю причину - это преобразование позиции. Он просто перемещает платформу, даже если мяч все еще находится в воздухе, тем самым меняя положение платформы прямо через мяч. Однако я не знаю, что делать дальше. Я пробовал использовать OnCollisionEnter, но не знаю, что добавить в метод OnCollisionEnter, потому что компоненты гравитации / столкновения не закодированы в скрипте. Я хочу, чтобы мяч отскакивал от платформы независимо от того, движется она или нет. Любая помощь будет принята с благодарностью. Спасибо.
1 ответ
Вам нужно будет прикрепить Rigidbody к этой платформе, а затем установить для поля isKinematic значение true в инспекторе.
Тогда вам нужно будет использовать RidigBody.MovePosition () вместо transform.position.
if(heldDownW)
{
rigidbody.MovePosition(new Vector3(transform.position.x, (transform.position.y + 1f), transform.position.z));
}
Кроме того, исходя из того, что я прочитал, было бы неплохо вместо этого поместить этот блок if в FixedUpdate (), потому что FixedUpdate () предназначен для вещей, связанных с физикой.
void Update()
{
if(Input.GetKeyDown(KeyCode.W))
{
heldDownW = true;
}
if(Input.GetKeyUp(KeyCode.W))
{
heldDownW = false;
}
}
void FixedUpdate()
{
if(heldDownW)
{
rigidbody.MovePosition(new Vector3(transform.position.x, (transform.position.y + 10f * Time.deltaTime), transform.position.z));
}
}
Другое дело использовать Time.deltaTime, когда вы выполняете расчет скорости:
if(heldDownW)
{
rigidbody.MovePosition(new Vector3(transform.position.x, (transform.position.y + 10f * Time.deltaTime), transform.position.z));
}
Используя Time.deltaTime, вы как бы говорите «двигайтесь на 10 метров в секунду вверх», если вы не используете Time.deltaTime, вы перемещаете его на 10 метров за кадр, а это не то, что вам нужно.
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.