- Home /
My character does not go forward when I jump?
Hello everyone,
I am having a big problem with the java script that I have.
I have customized and changed this code so many times. There were couple problems with the animations in this code but luckily I have fixed all of them.
Now, here is the problem that I have. When I press jump, while I am walking or running, my character does not move forward and jumping cuts it's speed. It's like he is hitting an invisible wall suddenly. I have tried everything to fix this problem but nothing seems working. The jump code looks correct. It gets the "moveDirection.y = jumpSpeed;" and so on. I have tried adding x and z moveDirection as well but that made it worst(character only went to a one direction).
Can someone help me please!!
Here is the code that I am using;
 var walkSpeed = 6.0;                            //How fast can the character walk
 
 var walkAnimSpeed:float;
 
 var runSpeed = 10.0;                            //How fast can the character run
 
 var runAnimSpeed:float;
 
 var toggleRun = false;                          //If checked, the run key toggles between running and walking. Otherwise character runs if the key is held down and walks otherwise.  There must be a button set up in the Input Manager called "Run"
 
 var limitDiagonalSpeed = true;                  //If true, diagonal speed (when strafing + moving forward or back) can't exceed normal move speed; otherwise it's about 1.4 times faster
 
 var jumpSpeed = 8.0;                            //How high can the character jump
 
 var gravity = 20.0;                             //How strong is gravity for the character
 
 var fallingDamageThreshold = 10.0;              //Units that character can fall before a falling damage function is run. To disable, type "infinity" in the inspector
 
 var slideWhenOverSlopeLimit = false;            //If checked, if the character ends up on a slope which is at least the slope limit as set on the character controller, then he will slide down
 
 var slideOnTaggedObjects = false;               //If checked and the character is on an object tagged "Slide", he will slide down it regardless of the slope limit
 
 var slideSpeed = 12.0;                          //Speed the character can slide
 
 var airControl = false;                         //If checked, then the player can change direction while in the air
 
 var antiBumpFactor = .75;                       //Small amounts of this results in bumping when walking down slopes, but large amounts results in falling too fast
 
 var antiBunnyHopFactor = 1;                     //Player must be grounded for at least this many physics frames before being able to jump again; set to 0 to allow bunny hopping 
 
 var idleSpeed:float;
 
 var rotateSpeed:float = 250.0;                  //Rotation speed of the character 
 
 private var moveDirection = Vector3.zero;       //The direction of movement
 
 private var grounded = false;                   //Is the character on the ground
 
 private var controller : CharacterController;   //Reference to the character controller
 
 private var myTransform : Transform;            //Reference to the transform
 
 private var speed : float;                      //Internal speed variable
 
 private var slideLimit : float;                 //Internal slide speed variable
 
 private var fallStartLevel : float;             //Height the character started to fall from
 
 private var falling = false;                    //Is the character falling
 
 private var hit : RaycastHit;                   //For checking distance to the ground
 
 private var rayDistance : float;                //For checking distance to the ground
 
 private var contactPoint : Vector3;             //For checking distance to the ground
 
 private var playerControl = false;              //Can the player control the character while in the air
 
 private var jumpTimer : int;                    //How long has the character been in the air
 
 private var mouseSideButton:boolean = false;    //Are the mouse side buttons being pressed
 
 private var pbuffer:float = 0.0;                //Cooldown pbuffer for mouse side buttons
 
 private var coolDown:float = 0.5;               //Cooldown time for mouse side buttons
 
 private var oldPos : Vector3; 
 
 private var moveStatus:String = "idle";
 
 private var moveSpeed:float = 0.0;
 
 private var jumping = false;
 
 
 
 function Start () {
 
     controller = GetComponent(CharacterController);
 
     myTransform = transform;
 
     speed = walkSpeed;
 
     rayDistance = controller.height * .5 + controller.radius;
 
     slideLimit = controller.slopeLimit - .1;
 
     jumpTimer = antiBunnyHopFactor;
 
     oldPos = transform.position;
 
 }
 
  
 function GetSpeed () {
     if (moveStatus == "idle")
         moveSpeed = 0;
         animation.Play("idle");
     if (moveStatus == "walk")
         moveSpeed = walkSpeed;
         animation.Play("walk");
     if (moveStatus == "run")
         moveSpeed = runSpeed;
         animation.Play("run");
     return moveSpeed;
 }
 
 function FixedUpdate() {
 
  
 
     //Get horizontal and vertical input axis and assign to variables
 
     var inputX = Input.GetAxis("Strafing");
 
     var inputY = Input.GetAxis("Vertical");
     
 
     //If both horizontal and vertical are used simultaneously, limit speed (if allowed), so the total doesn't exceed normal move speed
 
     var inputModifyFactor = (inputX != 0.0 && inputY != 0.0 && limitDiagonalSpeed)? .7071 : 1.0;
 
     
 
     //If the character is on the ground
 
     if (grounded) {
     
 
         //By default the character is not sliding
 
         var sliding = false;
 
         
 
         //Change moveDirection value to reflect the current direction of movement
 
         moveDirection = new Vector3((Input.GetMouseButton(1) ? Input.GetAxis("Strafing") : 0),0,Input.GetAxis("Vertical"));
         
         if(Input.GetAxis("Vertical") < 0.1){
 
             animation['idle'].speed = idleSpeed;
 
             animation.CrossFade("idle");
             
         }
         
         if(Input.GetAxis("Vertical") > 0){
 
         if(Input.GetButton("Run")){
 
             animation['run'].speed = runAnimSpeed;
 
             animation.CrossFade("run");
 
             controller.Move(transform.forward * runSpeed * Time.deltaTime);
 
         }
 
         else{
 
             animation['Walk'].speed = walkAnimSpeed;
 
             animation.CrossFade("Walk");
 
             controller.Move(transform.forward * walkSpeed * Time.deltaTime);
 
         }
 
     }
 
  
 
         //Pushbuffer to avoid on/off flipping
 
         if(pbuffer>0)
 
             pbuffer -=Time.deltaTime;
 
         if(pbuffer<0)pbuffer=0;
 
                        
 
         //Automove mouse side button movement
 
         if(Input.GetAxis("Toggle Move") && pbuffer == 0){
 
             pbuffer=coolDown;
 
             mouseSideButton = !mouseSideButton;
 
         }
         
 
         if(mouseSideButton && ((Input.GetAxis("Vertical") != 0) || Input.GetButton("Jump") || (Input.GetMouseButton(0) && Input.GetMouseButton(1)) ))
 
             mouseSideButton = false;
 
         
 
         //Strafing movement (like Q/E movement)
 
         moveDirection.x -= Input.GetAxis("Strafing");
 
         
 
         //See if surface immediately below should be slid down. We use this normally rather than a ControllerColliderHit point because that interferes with step climbing amongst other annoyances
 
         if (Physics.Raycast(myTransform.position, -Vector3.up, hit, rayDistance)) {
 
             if (Vector3.Angle(hit.normal, Vector3.up) > slideLimit)
 
                 sliding = true;
 
         }
 
         //However, just raycasting straight down from the center can fail when on steep slopes
 
         //So if the above raycast didn't catch anything, raycast down from the stored ControllerColliderHit point instead
 
         else {
 
             Physics.Raycast(contactPoint + Vector3.up, -Vector3.up, hit);
 
             if (Vector3.Angle(hit.normal, Vector3.up) > slideLimit)
 
                 sliding = true;
 
         }
 
  
 
         //If character was falling and fell a vertical distance greater than the threshold, run a falling damage routine
 
         if (falling) {
 
             falling = false;
 
             if (myTransform.position.y < fallStartLevel - fallingDamageThreshold)
 
                 FallingDamageAlert (fallStartLevel - myTransform.position.y);
 
         }
 
  
 
         //If running isn't on a toggle, then use the appropriate speed depending on whether the run button is down
 
         //if (!toggleRun) 
 
         //  speed = Input.GetButton("Run")? runSpeed : walkSpeed;
 
  
 
         //If sliding (and it's allowed), or if character is on an object tagged "Slide", get a vector pointing down the slope the character is on
 
         if ( (sliding && slideWhenOverSlopeLimit) || (slideOnTaggedObjects && hit.collider.tag == "Slide") ) {
 
             var hitNormal = hit.normal;
 
             moveDirection = Vector3(hitNormal.x, -hitNormal.y, hitNormal.z);
 
             Vector3.OrthoNormalize (hitNormal, moveDirection);
 
             moveDirection *= slideSpeed;
 
             playerControl = false;
 
         }
 
         //Otherwise recalculate moveDirection directly from axes, adding a bit of -y to avoid bumping down inclines
 
         else {
 
             moveDirection = Vector3(inputX * inputModifyFactor, -antiBumpFactor, inputY * inputModifyFactor);
 
             moveDirection = myTransform.TransformDirection(moveDirection) * speed;
 
             playerControl = true;
 
         }
 
         
 
         //L+R Mouse button movement
 
         if (Input.GetMouseButton(0) && Input.GetMouseButton(1) || mouseSideButton) {
 
             moveDirection.x = inputX * speed * inputModifyFactor;  //Strafe in the correct direction if Q/E are used
 
             moveDirection.z +=1 * speed;  //Move forward at the correct speed
 
             moveDirection = myTransform.TransformDirection(moveDirection);
 
             Screen.lockCursor = true;  //Lock the mouse cursor
 
         }
 
         else {
 
             Screen.lockCursor = false;  //Unlock the mouse cursor
 
         }
 
  
 
         //Jump, but only if the jump button has been released and the character has been grounded for a given number of frames
 
         if (!Input.GetButton("Jump"))
 
             jumpTimer++;
 
         else if (jumpTimer >= antiBunnyHopFactor) {
 
             moveDirection.y = jumpSpeed;
 
             jumpTimer = 0;
 
         }
 
     }
 
     
 
     //If the character is not on the ground
 
     else {
 
     
 
         //If the character stepped over a cliff or something, set the height at which the character started falling
 
         if (!falling) {
 
             falling = true;
 
             fallStartLevel = myTransform.position.y;
 
         }
 
  
 
         //If air control is allowed, check movement but don't touch the y component
 
         if (airControl && playerControl) {
 
             moveDirection.x = inputX * speed * inputModifyFactor;
 
             moveDirection.z = inputY * speed * inputModifyFactor;
 
                 // Give ability to jump forward while using both mouse buttons to move
 
                 if (Input.GetMouseButton(0) && Input.GetMouseButton(1) || mouseSideButton) {
 
                     moveDirection.z +=1 * speed;
 
                     Screen.lockCursor = true;  //Lock the mouse cursor.
 
                 }
 
                 else {
 
                     Screen.lockCursor = false;  //Unlock the mouse Cursor.
 
                 }
 
             moveDirection = myTransform.TransformDirection(moveDirection);
 
         }
 
     }
 
  
 
     //Allow turning at any time. Keep the character facing in the same direction as the camera if the right mouse button is down.
 
     if(Input.GetMouseButton(1)) {
 
         transform.rotation = Quaternion.Euler(0,Camera.main.transform.eulerAngles.y,0);
 
     } else {
 
         transform.Rotate(0,Input.GetAxis("Horizontal") * rotateSpeed * Time.deltaTime, 0);
 
     } 
 
  
 
     //Apply gravity
     
     Physics.gravity = Vector3(0, -9.8, 0);
 
     moveDirection.y -= gravity * Time.deltaTime;
 
     //Move the controller and set grounded to true or false depending on whether the character is standing on something
 
     grounded = (controller.Move(moveDirection * Time.deltaTime) & CollisionFlags.Below) != 0;
     
     
     jumping = grounded ? false : jumping;
 
 
 }
 
 
 
 function Update () {
 
  
 
     //If the run button is set to toggle then switch between walk/run speed
 
     if (toggleRun && grounded && Input.GetButtonDown("Run"))
 
         speed = (speed == walkSpeed? runSpeed : walkSpeed);
 
 
 }
 
  
 
 //Store point that character is in contact with for use in FixedUpdate if needed
 
 function OnControllerColliderHit (hit : ControllerColliderHit) {
 
     contactPoint = hit.point;
 
 }
  
 
 //If falling damage occured, this is the place to do something about it. You can make the character
 
 //have hitpoints and remove some of them based on the distance fallen, add sound effects, etc.
 
 function FallingDamageAlert (fallDistance : float) {
 
     Debug.Log ("Fell " + fallDistance + " units!");   
 
 }
Your answer
 
 
             Follow this Question
Related Questions
How to jump multiple times to mid air? 3 Answers
(CharacterController) Jumping from other script 0 Answers
Jump and move (CharacterController.velocity) C# 0 Answers
Jumping not always work 2 Answers
I aren't able to jump. I find no mistake in the script 1 Answer
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                