What is the point of the Resources folder ?

I wanted to instantiate a prefab from script and saw that the only solution was to apparently have the prefab inside the Resources folder then call Resources.Load(), which leads me wonder why shouldn’t all assets be inside the Resources folder ?

What are the reasons why one shouldn’t put all project assets inside the Resources folder ?

Basically, Unity will only include in builds the assets (Font, Texture, Mesh, ScriptableObject, etc.) that are referenced by one (or more) GameObject present in scene checked in the “Build Settings > Scene In Build”.
Every other assets will be excluded, except those inside the “Resources” Folder (and sub-folders). (as @Pangamini said)

which leads me wonder why shouldn’t all assets be inside the Resources folder ?

  1. Since many editor scripts can use assets such as UI sprites, fonts, helpers mesh, debug materials, etc. it would be a waste of space to include all this stuff inside the build. That’s why Unity doesn’t include all the project assets.

  2. Let’s say you want a Debug (or Production) version of your level, you want to include it in some specific builds, but not on your commercial builds, but you don’t want to delete your level or assets from your project on every iteration of this debug level, do you want all the debug stuff be packed ? No.

As @eric5h5 suggest, Resources.Load should usually be avoided. An example of use of Resources.Load would be the need of a big file that could be called at any moment of your game but you can’t determine because it is specific to multiple specific conditions (turned the other way: do you want your game to load a resources everytime when it will be used only 0.1% of the time ?) Unity says:

there may be a character or other object that can appear in any scene of the game but which will only be used infrequently (this might be a “secret” feature, an error message or a highscore alert, say).

Note that, for the previously mentionned reasons, you shouldn’t use Resources.Load to load Editor assets but AssetDatabase.LoadAssetAtPath.

Assets in resources folder are accessible by name (normally you can only access asset by reference created in the editor). The difference is that the management of the assets in resource folder is not automatic. You need to load/unload them. Unity is also unable to tell which assets from Resources will be used in the game, and therefore all of them are included in the build (normally, Unity can tell which assets are used and which are not, and unused assets will not make it to the build at all)