Слишком резкий прыжок unity 3d
Использовал классические инструменты для реализации передвижения персонажа: Rigidbody
и CapsuleCollider
. Для прыжка использовал функцию Rigidbody.AddForce()
. При использовании данной функции прыжок не должен происходить резко как телепортация, но происходит обратное. Вот наглядный пример того, как прыгает объект в моем проекте
Я же хочу добиться следующего результата:
В чем может быть проблема, если я реализовал логику прыжка точно таким же образом, как и автор поста Правильная реализация передвижения персонажа из клипа выше?
Еще информация, которая может оказаться важной: для более быстрого падения я в настройках Player Settings изменил значение Gravity для у с -9.81 на -200, так как до этого все объекты падали очень медленно. По моим наблюдениям, на мою проблему это вообще никак не влияет.
Вот код моего персонажа:
using UnityEngine;
public class HeroController : MonoBehaviour
{
//Oсновные параметры
[SerializeField] float jumpForce;
[SerializeField] float moveSpeed;
[SerializeField] float rotationSpeed;
[SerializeField] bool isGrounded;
// Параметры геймплея
private Vector3 moveVector;// направление передвижения
//Ссылки на компоненты
private MobileController mController;
private Animator ch_animator;
private Rigidbody rb;
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody>();
/*ch_animator = GetComponent<Animator>();*/
mController = GameObject.FindGameObjectsWithTag("Joystick")[0].GetComponent<MobileController>();
}
// Update is called once per frame
private void FixedUpdate()
{
Move();
Jump();
}
private void Move()
{
//перемещение персонажа
/*moveVector = Vector3.zero;*/
moveVector.x = mController.Horizontal() * moveSpeed;
moveVector.z = mController.Vertical() * moveSpeed;
if (moveVector.magnitude > 0.1f)
{
Quaternion rotation = Quaternion.LookRotation(moveVector);
transform.rotation = Quaternion.Lerp(transform.rotation, rotation, rotationSpeed * Time.deltaTime);
}
rb.velocity = moveVector;//метод передвижения
}
private void Jump()
{
if (Input.GetAxis("Jump") > 0)
{
if (isGrounded)
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
}
}
void OnCollisionEnter(Collision collision)
{
IsGroundedUpate(collision, true);
}
void OnCollisionExit(Collision collision)
{
IsGroundedUpate(collision, false);
}
private void IsGroundedUpate(Collision collision, bool value)
{
if (collision.gameObject.tag == ("Ground"))
{
isGrounded = value;
}
}
}
Код автора статьи.