Player movement - slide -> Jumping

sorry if i posted this twice, so im doing an endless game runner and i got everything working correctly but i only got a problem If the player hits the “jump” button while crouching, nothing happens until the “crouch” button is released , or the jump animation plays but the player still not jumping so if i want to jump i need to wait until the player goes from crouch to idle so i can use the jump correctly, heres all my scripts, and 2 images may help, btw im new at programming also unity so if someone could help me please tell full steps so i dont get lost , thank u all <3

public class PlayerMovement : MonoBehaviour

{

public CharacterController2D controller;

public Animator animator;

public float runSpeed = 40f; //change run speed from here

float horizontalMove = 0f;

bool jump = false;

bool crouch = false;

// Update is called once per frame

void Update()

{

horizontalMove = Input.GetAxisRaw(“Horizontal”) * runSpeed;

animator.SetFloat(“Speed”, Mathf.Abs(horizontalMove));

if (Input.GetButtonDown(“Jump”) && !crouch)

{

jump = true;

animator.SetBool(“IsJumping”, true);

}

if (Input.GetButtonDown(“Crouch”))

{

crouch = true;

}

else if (Input.GetButtonUp(“Crouch”))

{

crouch = false;

}

}

public void OnLanding()

{

animator.SetBool(“IsJumping”, false);

}

public void OnCrouching(bool isCrouching)

{

animator.SetBool(“IsCrouching”, isCrouching);

}

void FixedUpdate()

{

// Move our character

controller.Move(horizontalMove * Time.fixedDeltaTime, crouch, jump);

jump = false;

}

}

using UnityEngine;

using UnityEngine.Events;

public class CharacterController2D : MonoBehaviour

{

[SerializeField] private float m_JumpForce = 950f; // Amount of force added when the player jumps.

[Range(0, 1)] [SerializeField] private float m_CrouchSpeed = .36f; // Amount of maxSpeed applied to crouching movement. 1 = 100%

[Range(0, .3f)] [SerializeField] private float m_MovementSmoothing = .05f; // How much to smooth out the movement

[SerializeField] private bool m_AirControl = false; // Whether or not a player can steer while jumping;

[SerializeField] private LayerMask m_WhatIsGround; // A mask determining what is ground to the character

[SerializeField] private Transform m_GroundCheck; // A position marking where to check if the player is grounded.

[SerializeField] private Transform m_CeilingCheck; // A position marking where to check for ceilings

[SerializeField] private Collider2D m_CrouchDisableCollider; // A collider that will be disabled when crouching

const float k_GroundedRadius = .05f; // Radius of the overlap circle to determine if grounded

private bool m_Grounded; // Whether or not the player is grounded.

const float k_CeilingRadius = .1f; // Radius of the overlap circle to determine if the player can stand up

private Rigidbody2D m_Rigidbody2D;

private bool m_FacingRight = true; // For determining which way the player is currently facing.

private Vector3 m_Velocity = Vector3.zero;

[Header(“Events”)]

[Space]

public UnityEvent OnLandEvent;

[System.Serializable]

public class BoolEvent : UnityEvent { }

public BoolEvent OnCrouchEvent;

private bool m_wasCrouching = false;

private void Awake()

{

m_Rigidbody2D = GetComponent();

if (OnLandEvent == null)

OnLandEvent = new UnityEvent();

if (OnCrouchEvent == null)

OnCrouchEvent = new BoolEvent();

}

private void FixedUpdate()

{

bool wasGrounded = m_Grounded;

m_Grounded = false;

// The player is grounded if a circlecast to the groundcheck position hits anything designated as ground

// This can be done using layers instead but Sample Assets will not overwrite your project settings.

Collider2D[ ] colliders = Physics2D.OverlapCircleAll(m_GroundCheck.position, k_GroundedRadius, m_WhatIsGround);

for (int i = 0; i < colliders.Length; i++)

{

if (colliders*.gameObject != gameObject)*
{
m_Grounded = true;
if (!wasGrounded && m_Rigidbody2D.velocity.y < 0)
OnLandEvent.Invoke();
}
}
}
public void Move(float move, bool crouch, bool jump)
{
// If crouching, check to see if the character can stand up
if (!crouch)
{
// If the character has a ceiling preventing them from standing up, keep them crouching
if (Physics2D.OverlapCircle(m_CeilingCheck.position, k_CeilingRadius, m_WhatIsGround))
{
crouch = true;
}
}
//only control the player if grounded or airControl is turned on
if (m_Grounded || m_AirControl)
{
// If crouching
if (crouch)
{
if (!m_wasCrouching)
{
m_wasCrouching = true;
OnCrouchEvent.Invoke(true);
}
// Reduce the speed by the crouchSpeed multiplier
move *= m_CrouchSpeed;
// Disable one of the colliders when crouching
if (m_CrouchDisableCollider != null)
m_CrouchDisableCollider.enabled = false;
}
else
{
// Enable the collider when not crouching
if (m_CrouchDisableCollider != null)
m_CrouchDisableCollider.enabled = true;
if (m_wasCrouching)
{
m_wasCrouching = false;
OnCrouchEvent.Invoke(false);
}
}
// Move the character by finding the target velocity
Vector3 targetVelocity = new Vector2(move * 10f, m_Rigidbody2D.velocity.y);
// And then smoothing it out and applying it to the character
m_Rigidbody2D.velocity = Vector3.SmoothDamp(m_Rigidbody2D.velocity, targetVelocity, ref m_Velocity, m_MovementSmoothing);
// If the input is moving the player right and the player is facing left…
if (move > 0 && !m_FacingRight)
{
// … flip the player.
Flip();
}
// Otherwise if the input is moving the player left and the player is facing right…
else if (move < 0 && m_FacingRight)
{
// … flip the player.
Flip();
}
}
// If the player should jump…
if (m_Grounded && jump)
{
// Add a vertical force to the player.
m_Rigidbody2D.AddForce(new Vector2(0f, m_JumpForce));
}
}
private void Flip()
{
// Switch the way the player is labelled as facing.
m_FacingRight = !m_FacingRight;
// Multiply the player’s x local scale by -1.
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
}
}


8001814--1028950--Screenshot 2022-03-28 231733.png

If you post a code snippet, ALWAYS USE CODE TAGS:

How to use code tags: https://discussions.unity.com/t/481379

You may edit your post above.

How to report your problem productively in the Unity3D forums:

http://plbm.com/?p=220

Here is step-by-step how to figure out what is going on.

What is often happening in these cases is one of the following:

  • the code you think is executing is not actually executing at all
  • the code is executing far EARLIER or LATER than you think
  • the code is executing far LESS OFTEN than you think
  • the code is executing far MORE OFTEN than you think
  • the code is executing on another GameObject than you think it is
  • you’re getting an error or warning and you haven’t noticed it in the console window

To help gain more insight into your problem, I recommend liberally sprinkling Debug.Log() statements through your code to display information in realtime.

Doing this should help you answer these types of questions:

  • is this code even running? which parts are running? how often does it run? what order does it run in?
  • what are the values of the variables involved? Are they initialized? Are the values reasonable?
  • are you meeting ALL the requirements to receive callbacks such as triggers / colliders (review the documentation)

Knowing this information will help you reason about the behavior you are seeing.

If your problem would benefit from in-scene or in-game visualization, Debug.DrawRay() or Debug.DrawLine() can help you visualize things like rays (used in raycasting) or distances.

You can also call Debug.Break() to pause the Editor when certain interesting pieces of code run, and then study the scene manually, looking for all the parts, where they are, what scripts are on them, etc.

You can also call GameObject.CreatePrimitive() to emplace debug-marker-ish objects in the scene at runtime.

You could also just display various important quantities in UI Text elements to watch them change as you play the game.

If you are running a mobile device you can also view the console output. Google for how on your particular mobile target.

Another useful approach is to temporarily strip out everything besides what is necessary to prove your issue. This can simplify and isolate compounding effects of other items in your scene or prefab.

Here’s an example of putting in a laser-focused Debug.Log() and how that can save you a TON of time wallowing around speculating what might be going wrong:

https://discussions.unity.com/t/839300/3

You must find a way to get the information you need in order to reason about what the problem is.

And just like last time, you got a detailed reply on the same day, including telling you to use code-tags but didn’t respond so why not respond to the original post?

I will add that the 2D forum is not the place for someone who is completely new to writing code to dump a lot of code that is obviously copied from somewhere and ask that we sort it out.