Use this file to discover all available pages before exploring further.
Prowl’s entity-component model is the backbone of everything you build. Every interactive thing in a scene — a character, a camera, a light source, a trigger volume — is a GameObject. On its own a GameObject is just a named container with a Transform; the actual behaviour comes from MonoBehaviour components you attach to it. This mirrors the workflow many Unity developers are already familiar with while sitting on a clean .NET 9 foundation.
EngineObject is the root of every first-class object in Prowl (both GameObject and MonoBehaviour extend it). It provides:
Member
Purpose
InstanceID
Auto-incrementing integer unique to each live instance
AssetID
Guid used when the object is saved as an asset on disk
FileID
Sub-asset index inside an asset file (0 = main asset)
Name
Human-readable display name
IsDestroyed
Set to true after DestroyImmediate() / DestroyLater()
// Walk every MonoBehaviour of a given type in the active sceneMySystem?[] systems = EngineObject.FindObjectsOfType<MySystem>();// Lookup by runtime instance ID (integer)EngineObject obj = EngineObject.FindObjectByID<EngineObject>(someID);// Lookup by stable Guid identifierGameObject go = EngineObject.FindObjectByIdentifier<GameObject>(someGuid);
Comparing an EngineObject to null is safe — the equality operator returns true when the object IsDestroyed, so the pattern if (myRef == null) works even on destroyed objects.
// Empty object — will receive a Transform automaticallyGameObject empty = new GameObject("Player");// Instantiate from a prefab asset referenceAssetRef<Prefab> prefabRef = /* loaded from AssetDatabase */;GameObject fromPrefab = new GameObject(prefabRef);
// Generic, compile-time-safe formRigidbody rb = go.AddComponent<Rigidbody>();Rigidbody rb2 = go.GetComponent<Rigidbody>();// Pattern-match styleif (go.TryGetComponent<AudioSource>(out var audio)) audio.Play();// All components of a typeforeach (Collider col in go.GetComponents<Collider>()) col.Enabled = false;
// Walk up the parent chainCamera cam = go.GetComponentInParent<Camera>();// Walk down into childrenLight light = go.GetComponentInChildren<Light>(includeSelf: false);// Collect all renderers in the whole sub-treevar renderers = go.GetComponentsInChildren<MeshRenderer>();
go.RemoveComponent(existingComp); // one instancego.RemoveAll<AudioSource>(); // all of the same type
Removing a component that is required by another component on the same GameObject will fail with an error. Prowl checks [RequireComponent] dependencies before allowing removal.
Every GameObject has exactly one Transform that lives alongside the component list. You access it via go.Transform or from inside a MonoBehaviour via the Transform property.
// World-space read/writego.Transform.position = new Vector3(0, 1, 0);go.Transform.rotation = Quaternion.identity;// Local-space read/writego.Transform.localPosition = new Vector3(0, 0, 5);go.Transform.localEulerAngles = new Vector3(0, 90, 0);go.Transform.localScale = Vector3.one * 2f;// Convert between spacesVector3 world = go.Transform.TransformPoint(localPoint);Vector3 local = go.Transform.InverseTransformPoint(worldPoint);
The Transform caches world-space matrices using a dirty flag. Write to localPosition, localRotation, or localScale; world values are recomputed on demand.
// Clone an existing live object into the current sceneGameObject clone = GameObject.Instantiate(original);// From a prefab assetGameObject inst = GameObject.Instantiate(prefabRef);// With parentGameObject child = GameObject.Instantiate(original, parentGO);// With position, rotation, and parentGameObject placed = GameObject.Instantiate( original, position: new Vector3(10, 0, 0), rotation: Quaternion.identity, parent: null);
When a GameObject is created from a Prefab in the editor, it maintains a PrefabLink that records which fields have been deliberately overridden. Applying the link re-copies the prefab data while restoring the per-instance overrides:
// Read the link on a runtime instancePrefabLink link = go.PrefabLink;// Apply prefab data + per-instance overrideslink.Apply();// Check whether a specific field has been overridden locallybool overridden = link.HasChange(go, "Name");
// Link an existing GameObject to a prefabPrefabUtility.LinkToPrefab(go, prefabRef);// Permanently break the link (makes the object independent)PrefabUtility.BreakPrefabLink(go);