Мой мяч может отскочить только по оси 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;
}