Для реализации такого поведения в C# с использованием Unity, вы можете создать метод, который будет обрабатывать прыжок, и использовать Input.GetButton() для проверки, как долго кнопка удерживается. Вот пример кода, который можно добавить в вашу CharacterController или другой скрипт, отвечающий за управление персонажем:
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float baseJumpHeight = 1f; // базовая высота прыжка
public float maxJumpHeight = 2f; // максимальная высота прыжка
public float jumpForce = 10f; // сила прыжка
public Transform groundCheck; // трансформация для проверки земли под персонажем
public float groundCheckRadius = 0.2f; // радиус проверки земли
public LayerMask whatIsGround; // слой для определения, что является землей
private Rigidbody rb; // Rigidbody для персонажа
private bool isGrounded; // флаг, показывающий, находится ли персонаж на земле
private float jumpTime = 0f; // время, проведенное в прыжке
void Start()
{
rb = GetComponent();
}
void FixedUpdate()
{
isGrounded = Physics.CheckSphere(groundCheck.position, groundCheckRadius, whatIsGround);
if (isGrounded && Input.GetKeyDown(KeyCode.Space))
{
// Начало прыжка
jumpTime = 0;
ApplyJumpForce();
}
else if (isGrounded == false && Input.GetKey(KeyCode.Space))
{
// Продолжение прыжка при удержании клавиши
jumpTime += Time.fixedDeltaTime;
ApplyJumpForce();
}
else if (Input.GetKeyUp(KeyCode.Space))
{
// Окончание прыжка при отпускании клавиши
jumpTime = 0;
}
}
void ApplyJumpForce()
{
if (jumpTime <= 1f)
{
// Вычисляем изменяемую высоту прыжка в зависимости от времени удержания
float jumpHeight = Mathf.Lerp(baseJumpHeight, maxJumpHeight, jumpTime);
rb.AddForce(Vector3.up * jumpForce * jumpHeight, ForceMode.Impulse);
}
}
}
В этом коде мы проверяем, находится ли персонаж на земле, и если он находится, то начинаем прыжок при нажатии пробела (Input.GetKeyDown(
KeyCode.Space )). Во время прыжка, мы обновляем jumpTime и применяем силу прыжка (ApplyJumpForce()) с изменяемой высотой, используя Mathf.Lerp() для линейного интерполяции между базовой и максимальной высотой прыжка. При отпускании клавиши прыжка (Input.GetKeyUp(
KeyCode.Space )) мы обнуляем jumpTime.
Обратите внимание, что этот код должен быть настроен для вашего проекта, включая настройку компонентов, параметров прыжка и слоев объектов.