Search Unity

Trouble with On Land Event

Discussion in '2D' started by FuzeCraft, Sep 17, 2018.

  1. FuzeCraft

    FuzeCraft

    Joined:
    Oct 23, 2016
    Posts:
    3
    Hello !
    I'm working on Unity 2018.2.7f1 on a 2D project. I have a problem with my character's jump animation, let me explain myself : my character jumps well, but the animation doesn't work unless I press the jump button twice. I used a Debug.Log on my On Land's function, and I found out that 1/2sec after my jump, the function runs which stops the jump's animation. How can I solve this problem ?
    Tell me if you need anything from my project I'm a beginner to Unity.
    Thanks alot !
    Brodwin
     
  2. hamberge

    hamberge

    Joined:
    Aug 30, 2015
    Posts:
    34
    Can you post your code?
     
  3. FuzeCraft

    FuzeCraft

    Joined:
    Oct 23, 2016
    Posts:
    3
    Yes, this is my playermovement code.

    Code (CSharp):
    1.  
    2. using System.Collections;
    3. using System.Collections.Generic;
    4. using UnityEngine;
    5.  
    6. public class PlayerMovement : MonoBehaviour {
    7.  
    8.     public CharacterController2D controller;
    9.     public Animator animator;
    10.     public Rigidbody2D rigidBody2D;
    11.  
    12.     float horizontalMove = 0f;
    13.  
    14.     public float runSpeed = 40f;
    15.  
    16.     bool jump = false;
    17.  
    18.     bool sprint = false;
    19.  
    20.     // Update is called once per frame
    21.     void Update () {
    22.  
    23.         horizontalMove = Input.GetAxisRaw("Horizontal") * runSpeed;
    24.         animator.SetFloat("Speed", Mathf.Abs(horizontalMove));
    25.  
    26.  
    27.         if (Input.GetButtonDown ("Jump"))
    28.         {
    29.             jump = true;
    30.             animator.SetBool("IsJumping", true);
    31.         }
    32.  
    33.         if (Input.GetButtonDown("Shift"))
    34.         {
    35.             sprint = true;
    36.         }
    37.  
    38.         if (Input.GetButtonUp ("Shift"))
    39.         {
    40.             sprint = false;
    41.         }
    42.  
    43.         if (rigidBody2D.velocity.y == 0)
    44.         {
    45.             animator.SetBool ("IsJumping", false);
    46.         }
    47.  
    48.     }
    49.  
    50.     public void OnLanding ()
    51.     {
    52.         animator.SetBool("IsJumping", false);
    53.     }
    54.  
    55.     void FixedUpdate () {
    56.  
    57.         controller.Move(horizontalMove * Time.fixedDeltaTime, false, jump);
    58.         jump = false;
    59.     }
    60.  
    61. }
    And this is my characterController2D
    Code (CSharp):
    1.  
    2. using UnityEngine;
    3. using UnityEngine.Events;
    4.  
    5. public class CharacterController2D : MonoBehaviour
    6. {
    7.     [SerializeField] private float m_JumpForce = 400f;                            // Amount of force added when the player jumps.
    8.     [Range(0, 1)] [SerializeField] private float m_CrouchSpeed = .36f;            // Amount of maxSpeed applied to crouching movement. 1 = 100%
    9.     [Range(0, .3f)] [SerializeField] private float m_MovementSmoothing = .05f;    // How much to smooth out the movement
    10.     [SerializeField] private bool m_AirControl = false;                            // Whether or not a player can steer while jumping;
    11.     [SerializeField] private LayerMask m_WhatIsGround;                            // A mask determining what is ground to the character
    12.     [SerializeField] private Transform m_GroundCheck;                            // A position marking where to check if the player is grounded.
    13.     [SerializeField] private Transform m_CeilingCheck;                            // A position marking where to check for ceilings
    14.     [SerializeField] private Collider2D m_CrouchDisableCollider;                // A collider that will be disabled when crouching
    15.  
    16.     const float k_GroundedRadius = .2f; // Radius of the overlap circle to determine if grounded
    17.     private bool m_Grounded;            // Whether or not the player is grounded.
    18.     const float k_CeilingRadius = .2f; // Radius of the overlap circle to determine if the player can stand up
    19.     private Rigidbody2D m_Rigidbody2D;
    20.     private bool m_FacingRight = true;  // For determining which way the player is currently facing.
    21.     private Vector3 m_Velocity = Vector3.zero;
    22.  
    23.     [Header("Events")]
    24.     [Space]
    25.  
    26.     public UnityEvent OnLandEvent;
    27.  
    28.     [System.Serializable]
    29.     public class BoolEvent : UnityEvent<bool> { }
    30.  
    31.     public BoolEvent OnCrouchEvent;
    32.     private bool m_wasCrouching = false;
    33.  
    34.     private void Awake()
    35.     {
    36.         m_Rigidbody2D = GetComponent<Rigidbody2D>();
    37.  
    38.         if (OnLandEvent == null)
    39.             OnLandEvent = new UnityEvent();
    40.  
    41.         if (OnCrouchEvent == null)
    42.             OnCrouchEvent = new BoolEvent();
    43.     }
    44.  
    45.     private void FixedUpdate()
    46.     {
    47.         bool wasGrounded = m_Grounded;
    48.         m_Grounded = false;
    49.  
    50.         // The player is grounded if a circlecast to the groundcheck position hits anything designated as ground
    51.         // This can be done using layers instead but Sample Assets will not overwrite your project settings.
    52.         Collider2D[] colliders = Physics2D.OverlapCircleAll(m_GroundCheck.position, k_GroundedRadius, m_WhatIsGround);
    53.         for (int i = 0; i < colliders.Length; i++)
    54.         {
    55.             if (colliders[i].gameObject != gameObject)
    56.             {
    57.                 m_Grounded = true;
    58.                 if (!wasGrounded)
    59.                     OnLandEvent.Invoke();
    60.             }
    61.         }
    62.     }
    63.  
    64.  
    65.     public void Move(float move, bool crouch, bool jump)
    66.     {
    67.         // If crouching, check to see if the character can stand up
    68.         if (!crouch)
    69.         {
    70.             // If the character has a ceiling preventing them from standing up, keep them crouching
    71.             if (Physics2D.OverlapCircle(m_CeilingCheck.position, k_CeilingRadius, m_WhatIsGround))
    72.             {
    73.                 crouch = true;
    74.             }
    75.         }
    76.  
    77.         //only control the player if grounded or airControl is turned on
    78.         if (m_Grounded || m_AirControl)
    79.         {
    80.  
    81.             // If crouching
    82.             if (crouch)
    83.             {
    84.                 if (!m_wasCrouching)
    85.                 {
    86.                     m_wasCrouching = true;
    87.                     OnCrouchEvent.Invoke(true);
    88.                 }
    89.  
    90.                 // Reduce the speed by the crouchSpeed multiplier
    91.                 move *= m_CrouchSpeed;
    92.  
    93.                 // Disable one of the colliders when crouching
    94.                 if (m_CrouchDisableCollider != null)
    95.                     m_CrouchDisableCollider.enabled = false;
    96.             } else
    97.             {
    98.                 // Enable the collider when not crouching
    99.                 if (m_CrouchDisableCollider != null)
    100.                     m_CrouchDisableCollider.enabled = true;
    101.  
    102.                 if (m_wasCrouching)
    103.                 {
    104.                     m_wasCrouching = false;
    105.                     OnCrouchEvent.Invoke(false);
    106.                 }
    107.             }
    108.  
    109.             // Move the character by finding the target velocity
    110.             Vector3 targetVelocity = new Vector2(move * 10f, m_Rigidbody2D.velocity.y);
    111.             // And then smoothing it out and applying it to the character
    112.             m_Rigidbody2D.velocity = Vector3.SmoothDamp(m_Rigidbody2D.velocity, targetVelocity, ref m_Velocity, m_MovementSmoothing);
    113.  
    114.             // If the input is moving the player right and the player is facing left...
    115.             if (move > 0 && !m_FacingRight)
    116.             {
    117.                 // ... flip the player.
    118.                 Flip();
    119.             }
    120.             // Otherwise if the input is moving the player left and the player is facing right...
    121.             else if (move < 0 && m_FacingRight)
    122.             {
    123.                 // ... flip the player.
    124.                 Flip();
    125.             }
    126.         }
    127.         // If the player should jump...
    128.         if (m_Grounded && jump)
    129.         {
    130.             // Add a vertical force to the player.
    131.             m_Grounded = false;
    132.             m_Rigidbody2D.AddForce(new Vector2(0f, m_JumpForce));
    133.         }
    134.     }
    135.  
    136.  
    137.     private void Flip()
    138.     {
    139.         // Switch the way the player is labelled as facing.
    140.         m_FacingRight = !m_FacingRight;
    141.  
    142.         // Multiply the player's x local scale by -1.
    143.         Vector3 theScale = transform.localScale;
    144.         theScale.x *= -1;
    145.         transform.localScale = theScale;
    146.     }
    147. }
    148.  
     
  4. hamberge

    hamberge

    Joined:
    Aug 30, 2015
    Posts:
    34
    Does your character stop at the top of his jump? It's worth noting that vertical velocity can equal zero at the top of the jump.
     
  5. FuzeCraft

    FuzeCraft

    Joined:
    Oct 23, 2016
    Posts:
    3
    No it doesnt stop, only the animation stops right after the character jumps but the jump still works
     
  6. hamberge

    hamberge

    Joined:
    Aug 30, 2015
    Posts:
    34
    My guess is just that this code:

    if (rigidBody2D.velocity.y == 0)
    {
    animator.SetBool ("IsJumping", false);
    }


    is executed at the top of your guy's jump because vertical velocity is 0 at the top of any arced trajectory (it's physics). This may not be the case though, and it also doesn't seem to explain why you have to press jump twice.
     
  7. MehmetCakir

    MehmetCakir

    Joined:
    Jul 18, 2017
    Posts:
    3
    It is a problem with whatIsGround, character "thinks" that he/she is grounded right after you press jump button, so stops animation from playing immediately. So you can jump twice. I could not figure how to solve it though.
     
  8. Adien22

    Adien22

    Joined:
    Aug 19, 2019
    Posts:
    44
    Ok, so I found the only solution that worked, for me at least. I stopped using the OnLanding event, and instead, I added my animator to the character controller.
    everywhere you set m_Grouned to true, add animator.SetBool("IsJumping", true);
    everywhere you set m_Grounded false, add animator.SetBool("IsJumping", false);

    works like a charm for me now. Hope this helps if you still needed it

    If you do it this way, delete it out of your movement script also. or it won't work