There are many games with similar game play, but for your first game this is really well executed.
Here's an 'A' for putting in the effort to learn Unity and for making a game as clean as this one.
Also liked how the game responded in tight areas like when you could not get past obstacles or make a jump in time, it immediately triggered the end game sequence(sound).
I also noticed that the code generated was intelligent enough to know when the player was going to hit an obstacle or was in a path of a crash the sound began even before you came in contact.
(Which means that the computer knew very well that you would not make that jump.)hence - Intelligent.
The ball continues on for a few meters even after the game ends, which you can control- move and jump.This could be improved by disabling controls as soon as a contact is detected.
Games like this require an immediate reset, since it's an infinite runner kinda game.
The press O to display controls did not show anything, it just revealed part of it.
I've added a shared link where you might find what I'm talking about !
https://drive.google.com/file/d/1EePwiugsmkf2tczO2qphu9j1Djty-_-v/view?usp=sharing
This problem might be because of the screen size you put in and the Users display settings i'm not too sure about it.But I hope you fix it.
I don't understand why would you make the ball go backwards when you press 'S', at first I thought it was some kind of breaking mechanism but it also went in reverse.
I'd prefer if it just breaks rather than also go backwards.
The number of obstacles remains the same throughout the game and only gets faster with the distance travelled - this needs some adjustment in such a way that the number of obstacles increase for certain blocks of distance travelled and the speed increases with equivalent distance.
Everything mentioned above was suggested only as an opinion that can help better the overall game play experience.
Well done on your game and Good Luck further!