Continous movement using vectors

Hey,
I’m still very new to Unity, and, for simplicity of life, I am trying to make main player controllable, so I can observe what is happening in my project. For this, I was using an If statement in the Update() function, with Input.GetKeyDown(“space”). The problem is, this requires that the space bar is released before being used again, which prevents smooth continous movement. I then tried to put a While loop, but turns out putting a while loop in a function that gets called every frame isn’t a good idea (Unity just broke, I had to restart my computer). Does anyone have a simple solution to this ? And remember, I’m still very new, so if you could explain what the code sample does when you send it, that would be nice.
Thanks a lot.

GetKeyDown is mostly for actions you do want to trigger once until the button is released. Like shooting a sniper rifle. Or most commonly: jumping. What you are looking for is GetKey, which is true every frame the key is pressed, not just the first: https://docs.unity3d.com/ScriptReference/Input.GetKey.html

Very commonly, however, you want both directions, ie the entire axis (e.g. left+right). You dont have to handle the keys separately then, and instead can use the Input GetAxis provided by Unity: https://docs.unity3d.com/ScriptReference/Input.GetAxis.html

I personally would recommend simply working with KeyCodes instead of typing out strings. This also prevents annoying bugs if you msitype anything: https://docs.unity3d.com/ScriptReference/KeyCode.html
(Edit: The typo in mistype is hilarious so i decided to keep it :smile:)

Next, about while-loops.

Remember that computers (except for multi-threading) do everything sequentially. So a while loop checks a condition, and does something while this condition is true. GetKeyDown will be true for one frame… but that also means that it being true wont change until next frame. And since your loop does not exit until it becomes false, effectively you simply run your loop, permanently, forever, since Unity cant move on to the next frame while your code is running.
As a rule of thumb, unless you know what you are doing, infinite loops are something you dont want running in your game loop. Coroutines might be an exception, but i would generally advice against using Coroutines at all anyways.

Last but not least, there is a gazillion very useful tutorials on these basic things out there. I personally like to recommend the game development series made by Sebastian Lague, as he breaks down a lot of topics that confuse beginners in a very easy to understand way:

https://www.youtube.com/watch?v=_cCGBMmMOFw

The same guy also made a series about character controlling, if you want to jump directly into that instead:

https://www.youtube.com/watch?v=ZwD1UHNCzOc

Scripting starts at 6:38

Happy coding!

Thank you ! This was very helpful and informative. I’ll get to watching those ASAP. Have a good day.

1 Like

Welcome! This is a great approach and attitude… you want to always be searching for ways to figure out what is happening in your project. Every way that gives you insight is a good way.

Here are some other ways to make your code speak volumes about what is going on:

I recommend liberally sprinkling Debug.Log() statements through your code to display information in realtime.

If your problem would benefit from in-scene or in-game visualization, consider using Debug.DrawRay() or Debug.DrawLine() to visualize things like raycasts or distances.

You can also put in Debug.Break() to pause the Editor when certain interesting pieces of code run, and then study the scene manually, looking for all the parts, where they are, what scripts are on them, etc.

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.

Another useful approach is to temporarily strip out everything besides what is necessary to prove your issue. This can simplify and isolate compounding effects of other items in your scene or prefab.

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.

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:

https://discussions.unity.com/t/839300/3

Tutorials and example code are great, but keep this in mind to maximize your success and minimize your frustration:

How to do tutorials properly, two (2) simple steps to success:

Tutorials are a GREAT idea. Tutorials should be used this way:

Step 1. Follow the tutorial and do every single step of the tutorial 100% precisely the way it is shown. Even the slightest deviation (even a single character!) generally ends in disaster. That’s how software engineering works. Every step must be taken, every single letter must be spelled, capitalized, punctuated and spaced (or not spaced) properly, literally NOTHING can be omitted or skipped.

Fortunately this is the easiest part to get right: Be a robot. Don’t make any mistakes.
BE PERFECT IN EVERYTHING YOU DO HERE!!

If you get any errors, learn how to read the error code and fix your error. Google is your friend here. Do NOT continue until you fix your error. Your error will probably be somewhere near the parenthesis numbers (line and character position) in the file. It is almost CERTAINLY your typo causing the error, so look again and fix it.

Step 2. Go back and work through every part of the tutorial again, and this time explain it to your doggie. See how I am doing that in my avatar picture? If you have no dog, explain it to your house plant. If you are unable to explain any part of it, STOP. DO NOT PROCEED. Now go learn how that part works. Read the documentation on the functions involved. Go back to the tutorial and try to figure out WHY they did that. This is the part that takes a LOT of time when you are new. It might take days or weeks to work through a single 5-minute tutorial. Stick with it. You will learn.

Step 2 is the part everybody seems to miss. Without Step 2 you are simply a code-typing monkey and outside of the specific tutorial you did, you will be completely lost. If you want to learn, you MUST do Step 2.

Of course, all this presupposes no errors in the tutorial. For certain tutorial makers (like Unity, Brackeys, Imphenzia, Sebastian Lague) this is usually the case. For some other less-well-known content creators, this is less true. Read the comments on the video: did anyone have issues like you did? If there’s an error, you will NEVER be the first guy to find it.

Beyond that, Step 3, 4, 5 and 6 become easy because you already understand!