So, I already have a moving character with an animator and a character controller. I want in my world a jump path that launches my character into the air. I have already tried many things. Apparently, the simplest method is to use a rigid body, but as far as I understand, this is not compatible with a character controller. With the move function or with “launchDirection vector” I do get my character up when it hits a collider with a triger but this happens suddenly and then the character falls down without flying up first. I am an absolute beginner, so apologies in advance for possible stupid questions.
This is the script for controlling the character. Without any jump pad logic.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class game_controller_new : MonoBehaviour
{
[SerializeField]
public float rotationSpeed; // menu snelheid rotation
[SerializeField]
public float jumpHeight;
[SerializeField]
private float gravityMultiplier;
[SerializeField]
private float jumpHorizontalSpeed;
[SerializeField]
public float jumpButtonGracePeriod;
[SerializeField]
private Transform cameraTransform;
private Animator animator;
private CharacterController characterController;
private float ySpeed;
private float originalStepOffset;
private float? lastGroundedTime;
private float? jumpButtonPressedTime;
private bool isGrounded;
private bool isJumping;
private bool isSliding;
private Vector3 slopeSlideVelocity;
// Start is called before the first frame update
void Start()
{
animator = GetComponent<Animator>();
characterController = GetComponent<CharacterController>();
originalStepOffset = characterController.stepOffset;
}
// Update is called once per frame
void Update()
{
float horizontalInput = Input.GetAxis("Horizontal"); // ontvangen de hoeveelheid input horizontaal
float verticalInput = Input.GetAxis("Vertical"); // ontvangen hoeveelheid input vertikaal
Vector3 movementDirection = new Vector3(horizontalInput, 0, verticalInput);
float inputMagnitude = Mathf.Clamp01(movementDirection.magnitude);
if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) // wandelen met shifttoetsen
{
inputMagnitude /= 2; // snelheid door 2 bij shift
}
animator.SetFloat("Input Magnitude", inputMagnitude, 0.05f, Time.deltaTime);
movementDirection = Quaternion.AngleAxis(cameraTransform.rotation.eulerAngles.y, Vector3.up) * movementDirection;
movementDirection.Normalize(); //set diagnola vector zo dat deze niet sneller wordt
float gravity = Physics.gravity.y * gravityMultiplier;
if (isJumping && ySpeed > 0 && Input.GetButton("Jump") == false)
{
gravity *= 2;
}
ySpeed += gravity * Time.deltaTime;
SetSlopeSlideVelocity();
if (slopeSlideVelocity == Vector3.zero)
{
isSliding = false;
}
if (characterController.isGrounded)
{
lastGroundedTime = Time.time;
}
if (Input.GetButtonDown("Jump"))
{
jumpButtonPressedTime = Time.time;
}
if (Time.time - lastGroundedTime <= jumpButtonGracePeriod)
{
if (slopeSlideVelocity != Vector3.zero)
{
isSliding = true;
}
characterController.stepOffset = originalStepOffset;
if (isSliding == false)
{
ySpeed = -0.5f;
}
animator.SetBool("IsGrounded", true);
isGrounded = true;
animator.SetBool("IsJumping", false);
isJumping = false;
animator.SetBool("IsFalling", false);
if (Time.time - jumpButtonPressedTime <= jumpButtonGracePeriod && isSliding == false)
{
ySpeed = Mathf.Sqrt(jumpHeight * -3 * gravity);
animator.SetBool("IsJumping", true);
isJumping = true;
jumpButtonPressedTime = null;
lastGroundedTime = null;
}
}
else
{
characterController.stepOffset = 0;
animator.SetBool("IsGrounded", false);
isGrounded = false;
if ((isJumping && ySpeed < 0) || ySpeed < -2)
{
animator.SetBool("IsFalling", true);
}
}
if (movementDirection != Vector3.zero) // controleer of caracter beweegt
{
animator.SetBool("IsMoving", true);
Quaternion toRotation = Quaternion.LookRotation(movementDirection, Vector3.up);
transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, rotationSpeed * Time.deltaTime);
}
else
{
animator.SetBool("IsMoving", false);
}
if (isGrounded == false && isSliding == false)
{
Vector3 velocity = movementDirection * inputMagnitude * jumpHorizontalSpeed;
velocity.y = ySpeed;
characterController.Move(velocity * Time.deltaTime);
}
if (isSliding)
{
Vector3 velocity = slopeSlideVelocity;
velocity.y = ySpeed;
characterController.Move(velocity * Time.deltaTime);
}
}
private void SetSlopeSlideVelocity()
{
if (Physics.Raycast(transform.position + Vector3.up, Vector3.down, out RaycastHit hitInfo, 5))
{
float angle = Vector3.Angle(hitInfo.normal, Vector3.up);
if (angle >= characterController.slopeLimit)
{
slopeSlideVelocity = Vector3.ProjectOnPlane(new Vector3(0, ySpeed, 0), hitInfo.normal);
return;
}
}
if (isSliding)
{
slopeSlideVelocity -= slopeSlideVelocity * Time.deltaTime * 3;
if (slopeSlideVelocity.magnitude > 1)
{
return;
}
}
slopeSlideVelocity = Vector3.zero;
}
private void OnAnimatorMove()
{
if (isGrounded && isSliding == false)
{
Vector3 velocity = animator.deltaPosition;
velocity.y = ySpeed * Time.deltaTime;
characterController.Move(velocity);
}
}
//private void OnApplicationFocus(bool focus) // verberg cursor wanneer in game
//{
// if (focus)
// {
// Cursor.lockState = CursorLockMode.Locked;
// }
// else
// {
// Cursor.lockState = CursorLockMode.None;
// }
//}
}
This is my first time posting a question here, hopefully I have done it according to the rules of the art.