Red Redovich
Red Redovich

Reputation: 11

Unity jump issue

I make 3rd person game, where i have script for control model of my character. Problem is that when i jump and don't push any button he stack in the air, but if i jump with pushing controlling button he worked normally. Thanks in advance.

Player controller script:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(CharacterController))]
public class RelativeMovement : MonoBehaviour
{
    [SerializeField] private Transform target;

    public float rotSpeed = 5.0f;
    public float moveSpeed = 6.0f;

    public float jumpSpeed = 15.0f;
    public float gravity = -9.8f;
    public float terminalVelocity = -20.0f;
    public float minFall = -1.5f;

    private float _vertSpeed;

    private CharacterController _charController;

    private ControllerColliderHit _contact;

    void Start()
    {
        _vertSpeed = minFall;
        _charController = GetComponent<CharacterController>();
    }

    void Update()
    {
        Vector3 movement = Vector3.zero;

        float horInput = Input.GetAxis("Horizontal");
        float vertInput = Input.GetAxis("Vertical");

        if(horInput != 0 || vertInput != 0)
        {
            movement.x = horInput * moveSpeed;
            movement.z = vertInput * moveSpeed;
            movement = Vector3.ClampMagnitude(movement, moveSpeed);

            Quaternion tmp = target.rotation;
            target.eulerAngles = new Vector3(0, target.eulerAngles.y, 0);
            movement = target.TransformDirection(movement);
            target.rotation = tmp;

            Quaternion direction = Quaternion.LookRotation(movement);
            transform.rotation = Quaternion.Lerp(transform.rotation, 
                direction, rotSpeed * Time.deltaTime);

            bool hitGround = false;
            RaycastHit hit;
            if(_vertSpeed < 0 && Physics.Raycast(transform.position, Vector3.down, out hit))
            {
                float check =
                    (_charController.height + _charController.radius) / 1.9f;
                hitGround = hit.distance <= check;
            }

            if(hitGround)
            {
                if (Input.GetButtonDown("Jump"))
                {
                    _vertSpeed = jumpSpeed;
                }
                else
                {
                    _vertSpeed = minFall;
                }
            }
            else
            {
                _vertSpeed += gravity * 5 * Time.deltaTime;
                if(_vertSpeed < terminalVelocity)
                {
                    _vertSpeed = terminalVelocity;
                }

                if(_charController.isGrounded)
                {
                    if(Vector3.Dot(movement, _contact.normal) < 0)
                    {
                        movement = _contact.normal * moveSpeed;
                    }
                    else
                    {
                        movement += _contact.normal * moveSpeed;
                    }
                }
            }

            movement.y = _vertSpeed;
            movement *= Time.deltaTime;
            _charController.Move(movement);
        }
    }

    void OnControllerColliderHit(ControllerColliderHit hit)
    {
        _contact = hit;
    }
}

Jesus photo: enter image description here

Upvotes: 1

Views: 74

Answers (2)

Red Redovich
Red Redovich

Reputation: 11

The answer of this question is:

 if((horInput == 0 || vertInput == 0) || (horInput != 0 && vertInput != 0))
    {
        movement.x = horInput * moveSpeed;
        movement.z = vertInput * moveSpeed;
        if(horInput != 0 || vertInput != 0)
        {
            movement = Vector3.ClampMagnitude(movement, moveSpeed);

            Quaternion tmp = target.rotation;
            target.eulerAngles = new Vector3(0, target.eulerAngles.y, 0);
            movement = target.TransformDirection(movement);
            target.rotation = tmp;

            Quaternion direction = Quaternion.LookRotation(movement);
            transform.rotation = Quaternion.Lerp(transform.rotation,
                direction, rotSpeed * Time.deltaTime);
        }

Thanks Joe

Upvotes: 0

Joe
Joe

Reputation: 2253

I didn't go through all of the code but I can immediately see what can cause the problem you describe:

your entire logic happen under this if statement:

if(horInput != 0 || vertInput != 0)

So everything inside this logic block will happen only when you actively press a movement button.

You can remove it (or better yet, close the if block at the right spot.. I think it would be 2 lines down)

Upvotes: 1

Related Questions