Гораздо проще просто отключить гравитацию, чем постоянно бороться с ней;эта частая переналадка, вероятно, является причиной вашего бодрости. После активации велосипеда вы можете полностью взять расчеты объекта y velocity
в свои руки следующим образом:
public class Bike : MonoBehaviour
{
private Rigidbody hoverbike;
private bool isBikeActive = false;
[SerializeField] private float verticalSpeedMultiplier = 1f;
[SerializeField] private float hoverHeight = 10f;
[SerializeField] private float hoverTolerance = 0.5f;
[SerializeField] private float maximumVerticalVelocity = 10f;
private void Awake()
{
hoverbike = GetComponent<Rigidbody>();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space)) { ToggleBike(); }
if (isBikeActive)
{
Physics.Raycast(hoverbike.transform.position, Vector3.down, out RaycastHit hit);
Vector3 modifiedVelocity = hoverbike.velocity;
if ((hit.distance > hoverHeight - hoverTolerance) && (hit.distance < hoverHeight + hoverTolerance))
{
modifiedVelocity.y = 0f;
}
else
{
modifiedVelocity.y = -(hit.distance - hoverHeight) * verticalSpeedMultiplier;
modifiedVelocity.y = Mathf.Clamp(modifiedVelocity.y, -maximumVerticalVelocity, maximumVerticalVelocity);
}
Debug.Log($"Distance from ground: {hit.distance}, Bike Velocity.y: {modifiedVelocity}");
hoverbike.velocity = modifiedVelocity;
}
}
private void ToggleBike()
{
isBikeActive = !isBikeActive;
hoverbike.useGravity = !isBikeActive;
}
}
Теперь ваш мотоцикл всегда будет пытаться двигаться к точке hoverHeight
единицнад объектом под ним, пока он не окажется в пределах hoverTolerance
от этой точки. Он также будет двигаться более плавно к этой точке, двигаясь тем быстрее, чем дальше от заданной высоты.
Если вы хотите, чтобы мотоцикл все еще немного качался вверх и вниз, этого можно добиться, изменивhoverHeight
медленно с течением времени, возможно, благодаря использованию функции синуса.