Я пытаюсь сделать игру, в которой вы отскакиваете мячом вверх и вниз по платформе. Я добавил к шару компонент твердого тела, сделав шар «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, потому что компоненты гравитации / столкновения не закодированы в скрипте. Я хочу, чтобы мяч отскакивал от платформы независимо от того, движется она или нет. Любая помощь будет принята с благодарностью. Спасибо.

0
Sonu Bae 17 Сен 2013 в 03:50

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 метров за кадр, а это не то, что вам нужно.

1
Albert 17 Сен 2013 в 09:28