Assets in Prowl are any importable file — meshes, textures, audio clips, materials, shaders, prefabs, scenes, fonts, scripts, and more. Each asset is assigned a stable GUID the moment it is first seen. All in-code references use that GUID, so files can be moved or renamed without breaking anything. Importing, caching, and loading is handled byDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/ProwlEngine/Prowl/llms.txt
Use this file to discover all available pages before exploring further.
AssetDatabase in the editor and by a pluggable IAssetProvider at runtime.
Asset types
Prowl ships with first-party runtime resource types that all extendEngineObject:
Mesh
Built-in or imported 3-D geometry with vertex/index buffers.
Material
References a
Shader plus per-material property overrides.Shader
HLSL/GLSL source compiled to a GPU program.
Texture2D
2-D image loaded from PNG, JPG, TGA, DDS, and more.
AudioClip
WAV or OGG audio data.
Prefab
Reusable
GameObject hierarchy template.Scene
A full scene file serialised in Echo format.
AnimationClip
Keyframe animation data.
Font
TrueType/OpenType font for UI rendering.
TextAsset
Raw text file loaded as a string.
ScriptableObject
Data-only asset defined in C#.
MonoScript
Reference to a compiled C# script type.
AssetRef<T> — typed asset handles
AssetRef<T> is a lightweight value-type wrapper (a struct) that represents a reference to any EngineObject-based asset. It stores the GUID and an optional FileID (for sub-assets), plus a cached instance pointer.
Key AssetRef<T> members
| Member | Description |
|---|---|
Res | Loads and returns the instance; null only if the asset is missing |
ResWeak | Returns the cached instance without triggering a load |
IsAvailable | Triggers a load attempt; returns false if still missing |
IsLoaded | true if the instance is already in memory |
IsExplicitNull | true if both instance and GUID are empty (intentional null) |
IsRuntimeResource | true for objects created at runtime with no GUID |
AssetID | The GUID of the referenced asset |
FileID | Sub-asset index (0 = main asset) |
EnsureLoaded() | Preloads the asset without returning it |
Detach() | Clears the cached pointer to allow GC without losing the GUID |
IAssetProvider — runtime loading interface
IAssetProvider abstracts the underlying storage so the same game code works in the editor and in a built game:
Application.AssetProvider. In the editor this is backed by AssetDatabase; in a shipped build it uses a standalone bundle reader. AssetRef<T>.Res calls Application.AssetProvider.LoadAsset<T>() automatically — you rarely need to call the provider directly.
Meta files and GUID tracking
Every asset file on disk has a sidecar.meta file with the same base name. The meta file is managed by the MetaFile class:
.meta file alongside it, preserving all GUID-based references throughout your project.
Never edit
.meta files by hand and never commit asset files without their corresponding .meta files into source control — the GUID in the meta file is what ties all script references together.AssetDatabase (editor-only)
AssetDatabase is a static, partial class in Prowl.Editor.Assets that manages the import cache, file watching, and in-memory asset data.
Refresh / update cycle
Update() is called automatically every 5 seconds while the editor window is focused. Use LockUpdate() / UnlockUpdate() to batch changes without spurious reimports:
Loading assets (editor)
GUID ↔ path utilities
File operations
Saving a modified asset
ScriptedImporter — custom importers
AScriptedImporter is a class that converts a raw source file into one or more EngineObjects. You declare which file extensions it handles via the [Importer] attribute, and implement Import() to populate a SerializedAsset context:
Create the importer class
Extend
ScriptedImporter and apply [Importer] with an icon path, the primary output type, and one or more file extensions.Implement Import()
Read the source file, construct one or more
EngineObject instances, and call ctx.SetMainObject(). Optionally add sub-assets with ctx.AddSubObject().Drop a file into your Assets folder
AssetDatabase.Update() detects the new file, creates a .meta file pointing to your importer, and calls Import(). The output is cached in Library/AssetDatabase/.| Importer | Extensions |
|---|---|
TextureImporter | .png, .bmp, .jpg, .jpeg, .tga, .dds, .webp, .tif, .tiff, .gif |
AudioClipImporter | .wav, .wave, .ogg |
MeshImporter | .mesh |
ModelImporter | .obj, .blend, .dae, .fbx, .gltf, .ply, .pmx, .stl |
FontImporter | .ttf |
ShaderImporter | .shader |
ComputeShaderImporter | .compute |
MaterialImporter | .mat |
SceneImporter | .scene |
PrefabImporter | .prefab |
ScriptableObjectImporter | .scriptobj |
MonoScriptImporter | .cs |
TextAssetImporter | .txt, .md |
Sub-assets
A single source file can produce multipleEngineObjects. For example, a model file may import as one main Mesh with several embedded Material sub-assets. Sub-assets are identified by a FileID starting at 1:
Asset caching details
Asset caching details
After a successful import, the serialised asset data is written to
Library/AssetDatabase/<guid>.serialized. On the next load request, AssetDatabase reads from this cached file rather than re-running the importer. The cache is invalidated when the source file’s LastWriteTime changes or when the meta file’s version is outdated.Cached objects are kept in memory in guidToAssetData. If the main or any sub-asset is found to be destroyed, the whole entry is evicted and reloaded from disk on the next access.