I have tried to create an alternative to the jumping section of the Character Motor to allow the player, no matter where I turn the gravity, to jump in opposite direction.
But I encounter a problem with the basic element of jumping, the character sometimes refuses to jump, instead wriggling a little on the ground. Sometimes he shakes, and then jumps. I am not sure what causes this, as I have tried to use the most basic function.
I have reduced the code to the very essence of what should make the character jump, so the problem is definitely somewhere here. Does anybody know what stupid mistake I made this time?
using UnityEngine;
using System.Collections;
public class Player_Jump_Script_New : MonoBehaviour
{
public Vector3 moveDirection;
public CharacterController Controller;
public float gravity;
void Start ()
{Controller = GetComponent<CharacterController>();}
void Update ()
{
if(CanJump==true)
{
if (Input.GetButtonDown("Jump"))
{
CanJump=false;
moveDirection.y = jumpSpeed;
StartCoroutine(JumpOver(0.5f));
}
Controller.Move(moveDirection * Time.deltaTime);
}
}
IEnumerator JumpOver (float temp)
{
yield return new WaitForSeconds (temp);
if(IsJumping==true)
{
moveDirection.y = -gravity;
CanJump=true;
}
}
}
Forger it, I have created a normal rigidbody character movement system, so this isn’t a problem anymore)
if anybody will find this answer searching to solve a similar problem, here’s my solution:
using UnityEngine;
using System.Collections;
public class RigidbodyJump : MonoBehaviour {
public bool CanJump;
public float Player_Gravity;
public float MinJumpHeight;
public float force;
public bool IsJumping;
public bool CheckIfCanJump;
public float speed;
public float WalkingSpeed;
public float RunningSpeed;
public float RunningTimer;
public float RunningTimerMax;
public float RunningTimerDrain;
public float RunningTimerRecharge;
private bool IsRunning;
public Vector3 MovementDirection;
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void FixedUpdate ()
{
if(Input.GetKey("left shift")&&RunningTimer>0)
{
IsRunning=true;
}
else
{
IsRunning=false;
}
if(IsRunning==true)
{
speed = RunningSpeed;
RunningTimer -= RunningTimerDrain;
}
else
{
speed = WalkingSpeed;
if(RunningTimer<=RunningTimerMax)
{
RunningTimer += RunningTimerRecharge;
}
}
if(Input.GetButtonDown("Jump"))
{
if(CanJump==true)
{
transform.rigidbody.AddForce(Vector3.up * force);
IsJumping=true;
CanJump=false;
StartCoroutine(CheckIfCanJumpAgain(0.1f));
}
}
if(CheckIfCanJump==true)
{
RaycastHit hit;
if (Physics.Raycast(transform.position, -transform.up, out hit, 100.0F))
{
if(hit.distance<=MinJumpHeight)
{
CanJump=true;
IsJumping=false;
CheckIfCanJump=false;
}
}
}
if(Input.GetButton("w"))
{
MovementDirection.z = 1;
}
else
{
MovementDirection.z = 0;
}
if(Input.GetButton("s"))
{
MovementDirection.z = -1;
}
if(Input.GetButton("a"))
{
MovementDirection.x = -1;
}
else
{
MovementDirection.x = 0;
}
if(Input.GetButton("d"))
{
MovementDirection.x = 1;
}
transform.rigidbody.AddForce(-Vector3.up * Player_Gravity);
transform.Translate(MovementDirection * speed);
}
IEnumerator CheckIfCanJumpAgain (float temp)
{
yield return new WaitForSeconds (temp);
CheckIfCanJump = true;
}
public void SwitchGravity()
{
Player_Gravity = -Player_Gravity;
}
}