UNITY GETCOMPONENT EXPLAINED: BEST PRACTICES & CACHING
Understand how Unity searches GameObject memory trees for components, why invoking GetComponent in Update destroys mobile framerates, and how to cache references.
1. How GetComponent Works Internally
When you call GetComponent<Rigidbody>(), Unity does not access a simple C# variable. It must bridge the managed C# layer into the native C++ engine core, iterate through the GameObject's component array, perform type reflection checks, and return the pointer.
Calling this 60 times a second inside Update() for dozens of enemies or projectiles creates continuous CPU stalls and GC allocations.
2. The Standard Caching Pattern in Awake()
Always search for the component once during Awake(), store the reference in a private field, and reuse that cached pointer in Update():
using UnityEngine;
// [RequireComponent] guarantees the Inspector automatically attaches a Rigidbody!
[RequireComponent(typeof(Rigidbody))]
public class SpeedBoostController : MonoBehaviour
{
private Rigidbody rb; // Cached reference
private void Awake()
{
// 1. Fetch once at initialization
rb = GetComponent<Rigidbody>();
}
private void FixedUpdate()
{
// 2. Reuse the cached pointer every physics tick (Zero search overhead!)
if (Input.GetKey(KeyCode.LeftShift))
{
rb.AddForce(transform.forward * 20f, ForceMode.Acceleration);
}
}
}
3. TryGetComponent: The Modern Standard
In trigger and collision handlers where you are checking whether an unknown target has a component, use TryGetComponent:
private void OnTriggerEnter(Collider other)
{
// ✅ Fast, safe, and generates 0 GC allocations in Editor/Builds
if (other.TryGetComponent<HealthSystem>(out HealthSystem health))
{
health.TakeDamage(15f);
}
}
4. Component Search Variations
Awake().
List<T> populates all matching components without allocating a new array.
Related Topics & Troubleshooting
Frequently Asked Questions
[RequireComponent(typeof(Rigidbody))] forces the Unity Editor to automatically attach a Rigidbody whenever you add your custom script to a GameObject. It also prevents designers from accidentally deleting the required component in the Inspector.
GetComponent only searches the current single GameObject. FindObjectOfType (or FindFirstObjectByType in Unity 2023+) must scan the entire active scene hierarchy across thousands of objects, which causes severe frame drops.