0
votes

I'm using the Charactercontroller component for the movement of my character. The thing I'm trying to achieve is for the character to go when I'm clicking with the mouse. For that, I'm rotating where I click and then going forward to the point where the ray collider with my terrain. The character does move and goes to the point I want. The problem is when walking into a ramp, for example, the character keeps walking in the air and does not go down (gravity problem as far as I can understand although when I test putting the character in the air when the editor it does go down) it stops above when it supposed to go and starts spinning really fast. Here's my movement script

 private float gravity = 1f;
Animator anim;
CharacterController charController;
private float mvtSpeed = 3f;
private float distanceToPoint;
Vector3 playerMvt;
bool canMove = false;
CollisionFlags collisionFlags;
Ray ray;
RaycastHit hit;
Vector3 PlayerTarget;
float height;

private void Awake()
{
    anim = GetComponent<Animator>();
    charController = GetComponent<CharacterController>();
}
void MoveThePlayer()
{
    if (Input.GetMouseButton(0))
    {
        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out hit)) {
            if (hit.collider is TerrainCollider)
            {
                if (Vector3.Distance(transform.position, hit.point) >= 0.5f)
                {
                    canMove = true;
                    anim.SetFloat("Walk", 1.0f);
                    PlayerTarget = hit.point;

                }
            }//terrain collider
        }//raycast
    }//mouse Down

    if (canMove)
    {
        Vector3 targetTemp = new Vector3(PlayerTarget.x, transform.position.y, PlayerTarget.z);
        transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(targetTemp - transform.position), 15.0f * Time.deltaTime);
        playerMvt = transform.forward * mvtSpeed * Time.deltaTime;
        if (Vector3.Distance(transform.position, PlayerTarget) <= 0.1f)
        {
            anim.SetFloat("Walk", 0f);
            playerMvt.Set(0f, 0f, 0f);
        }

    }//canMove

}
private void Update()
{
    MoveThePlayer();
    charController.Move(playerMvt);
    if (!charController.isGrounded)
    {
        playerMvt.y -= gravity * Time.deltaTime;
    }

}
1
Does the player fall down if you release the mouse button? - Fredrik Widerberg

1 Answers

2
votes

A few things.

canMove is never reset to false, it should probably reset in here

 if (Vector3.Distance(transform.position, PlayerTarget) <= 0.1f)
 {
     anim.SetFloat("Walk", 0f);
     playerMvt.Set(0f, 0f, 0f);
 }

This code has no impact where its located right now:

if (!charController.isGrounded)
{
    playerMvt.y -= gravity * Time.deltaTime;
}

You apply gravity to playerMvt.y after you have already moved the player, and the next frame you will re-assign playerMvt here:

playerMvt = transform.forward * mvtSpeed * Time.deltaTime;

So change it up to this

private void Update()
{
    MoveThePlayer();
    if (!charController.isGrounded)
    {
        playerMvt.y -= gravity * Time.deltaTime;
    }
    charController.Move(playerMvt);
}