When you import a 3D model into your project in the Unity Editor, Unity converts the 3D model into an internal mesh format that's optimized specifically for the Unity engine (and stores this somewhere in the Library
folder inside your project directory).
You noticed that if you download a file into the Resources
folder in the Editor while the game is playing, you can't immediately access it using Resources.Load<>
. That's because the Editor hasn't yet parsed the model file into a mesh. Calling AssetDatabase.Refresh
tells the Editor to look for new files in the Resources folder and convert them into a Unity-friendly format (which is then stored somewhere in the Library
folder).
When you call Resources.Load<>
, Unity is not reading the original OBJ file and converting it into a mesh; it is loading the previously converted mesh. When you make a build, Unity only includes the converted mesh, not the original OBJ file.
All of the assets in the Resources
folder are packaged into a single Resources file when you make a build. In a build, the Resources
folder no longer exists - there is only the Resources file that contains the assets that were already converted into Unity-friendly formats by the Editor. There's no way to add new files to the Resources
folder in a build because it doesn't even exist in the build.
Resources.Load<>
is not particularly fast - in fact, it's a messy and inefficient way of loading files at runtime. It just seems fast compared to a runtime file importer because it doesn't have to import or parse anything. If you're trying to benchmark it against a runtime model loader, you need to also include the amount of time that AssetDatabase.Refresh()
takes, because that is what actually parses and converts the mesh data from the OBJ file.
If "Runtime Obj Importer" is not fast enough, you'll either need to modify it yourself, or find a different library that can import OBJ files at runtime.