Использование Unity Physics для последовательного отскока мяча на одну и ту же высоту - PullRequest
0 голосов
/ 16 апреля 2019

Мой мяч может отскочить только по оси Y.Движение по осям X и Z, а также все вращения зафиксированы в компоненте твердого тела.Первоначально я планировал справиться с этим, используя комбинацию из двух методов ниже.Я добавляю собственную искусственную гравитацию к объекту в FixedUpdate и отскакиваю мяч вверх, когда он сталкивается с платформой в OnCollisionEnter.По сути, это заставляет его подпрыгивать вверх и вниз навсегда.

void OnCollisionEnter(Collision collision)
{
    ball.AddForce(Vector3.up * force, ForceMode.Impulse);
}

void FixedUpdate()
{
    Vector3 gravity = globalGravity * Vector3.up;
    ball.AddForce(gravity, ForceMode.Acceleration);
}

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

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

IEnumerator MoveBall(Vector2 newPos, float time)
{
    ball.useGravity = false;
    float elapsedTime = 0;
    Vector2 startingPos = transform.position;
    while (elapsedTime < time)
    {
        transform.position = Vector2.Lerp(startingPos, newPos, (elapsedTime / time));
        elapsedTime += Time.deltaTime;
        yield return null;
    }
    ball.useGravity = true;
}

1 Ответ

1 голос
/ 16 апреля 2019

Похоже, вы хотите, чтобы ваш коллайдер был настроен как триггер.На коллайдере вашего мяча установите isTrigger на true, а затем используйте OnTriggerEnter вместо OnCollisionEnter.Это не позволит физическому движку Unity создавать и разрешать Collision между мячом и всем, что он ударяет.

Если вы также хотите, чтобы мяч отскочил от прочее объектов, использующих физику Unity, вам нужно проявить творческий подход к тому, какие коллайдеры являются / не являются триггерами и к каким физическим слоям они принадлежат.

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