Hey guys, so I am trying to make a game where you can press one button to switch from running to walking (like in Skyrim). But I just can’t get my script to work… I made it so you Sprint on left shift, and planned to make the “triggerKey” for run/walk to ‘K’. But I can’t get it to work. (The problem atm. The ‘K’ key rarely triggers walking)
private void Move()
{
float moveZ = Input.GetAxis(“Vertical”); // Setting up Vertical movement (forward and backwards)
float moveX = Input.GetAxis(“Horizontal”); // setting up Horizontal movement (left and right)
moveDirection = new Vector3(moveX, 0, moveZ); // enabling the movement
if (moveDirection != Vector3.zero && Input.GetKeyDown(KeyCode.K))
{
// walk
Walk();
}
else if (moveDirection != Vector3.zero && !Input.GetKeyDown(KeyCode.K) && !Input.GetKey(KeyCode.LeftShift))
{
// Run
Run();
}
else if (moveDirection != Vector3.zero && Input.GetKey(KeyCode.LeftShift))
{
// Sprint
Sprint();
}
else
{
// Idle
Idle();
}
moveDirection *= moveSpeed; // Setting movement speed
To find out what your code is actually doing, use these steps:
What is often happening in these cases is one of the following:
the code you think is executing is not actually executing at all
the code is executing far EARLIER or LATER than you think
the code is executing far LESS OFTEN than you think
the code is executing far MORE OFTEN than you think
the code is executing on another GameObject than you think it is
To help gain more insight into your problem, I recommend liberally sprinkling Debug.Log() statements through your code to display information in realtime.
Doing this should help you answer these types of questions:
is this code even running? which parts are running? how often does it run? what order does it run in?
what are the values of the variables involved? Are they initialized? Are the values reasonable?
are you meeting ALL the requirements to receive callbacks such as triggers / colliders (review the documentation)
Knowing this information will help you reason about the behavior you are seeing.
You can also put in Debug.Break() to pause the Editor when certain interesting pieces of code run, and then study the scene
You could also just display various important quantities in UI Text elements to watch them change as you play the game.
If you are running a mobile device you can also view the console output. Google for how on your particular mobile target.
Here’s an example of putting in a laser-focused Debug.Log() and how that can save you a TON of time wallowing around speculating what might be going wrong:
If moving and on the frame you press “k”, run Walk
If moving and on the frame “k” is not pressed down and shift is not held, run Run
Do you see the issue? Walk is only triggered for 1 frame, when you press K down
As soon as the next frame hits, you are no longer pressing the K key down, so the second if runs, thus you return to Running.
This is simple logic checking. And I see @Kurt-Dekker posted just a second before me. READ his post as well as it will help you learn how to debug your own code.
If you could put code inside a “Code” block, it will help people read your logic.
As for your question, I don’t see anything changing your movement speed.
I suggest you have an “isSprinting” flag. Set or clear the isSprinting flag when you get keypress events, and separately calculate the movement speed when you are about to determine your movement or body animation. This becomes much more convenient when you also want to calculate other adjustments like “isOverloaded” or “isCrouching”.