Use the character information (with examples)

The term information here covers everything related to public getters and flags such as collision flags, physics contacts, triggers, grounding status, and so on. These values can be very useful when creating new gameplay mechanics.

Grounded state

if (CharacterActor.IsGrounded)
{
    DoGroundLogic();
}

Wall collision example

The same can be applied to some other property, for example, if we need to trigger some animation parameter only when the character is touching a wall:

if (CharacterActor.WallCollision)
{
    // Do wall collision logic.
}

Wall running behavior

if (!CharacterActor.IsGrounded && CharacterActor.WallCollision)
{
    // Do grounded logic.
}

Slide movement

Let's say our character is standing on a steep slope (unstable state) and we want to make it slide down. What we can do is getting the unstable state first and then applying the movement.

if (!CharacterActor.IsStable)
{
    // Do Slide
}

However, the character can be unstable while it's in the air, so we need to be sure the character is grounded as well:

if (!CharacterActor.IsStable && CharacterActor.IsGrounded)
{
    // Do Slide
}

We can simplify this condition by using the CurrentState property from the actor (for more information please read the States section).

if (CharacterActor.CurrentState == CharacterActorState.UnstableGrounded)
{
    // Do Slide
}

Now, lets add one more condition. We want to execute the slide movement 1 second after making contact with this unstable surface. One way to do this is by using a property called GroundedTime (you have also NotGroundedTime, StableGroundedTime and UnstableGroundedTime).

if (CharacterActor.CurrentState == CharacterActorState.UnstableGrounded)
{
    if (CharacterActor.GroundedTime >= 1f)
    {
        // Do Slide
    }    
}

Making the character slide is very simple. Based on this section, we know that only collide and slide is applied to the character. So, we need to move the character downwards, the collide and slide algorithm will handle that for us (also, the physics simulation does the same thing).

So, this is the final code:

if( CharacterActor.CurrentState == CharacterActorState.UnstableGrounded )
{
    if( CharacterActor.GroundedTime >= 1f )
    {
        CharacterActor.Velocity += - CharacterActor.Up * slideAcceleration * Time.deltaTime;
    }    
}

Last updated