![unity]()
The MonoBehaviour class is the foundation of nearly every Unity script you’ll write. It provides a set of built-in methods and event functions that allow your script to interact with Unity’s core engine features, such as the physics engine, rendering loop, input system, and more. Understanding the basic behavior of a MonoBehaviour script is essential for any Unity developer, whether you’re working on a 2D mobile game or a complex VR simulation.
What is MonoBehaviour?
MonoBehaviour is a base class from which every Unity script derives when you want to attach that script to a GameObject. It’s part of the UnityEngine namespace and acts as a bridge between your C# code and Unity’s event-driven architecture.
Here’s a simple MonoBehaviour script.
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
void Start()
{
Debug.Log("Game Started!");
}
void Update()
{
Debug.Log("Frame Updated");
}
}
MonoBehaviour Lifecycle: The Core Events
Unity manages MonoBehaviour scripts through a specific lifecycle. Understanding these methods helps you control object behavior in the scene effectively.
1. Awake()
2. OnEnable()
3. Start()
4. Update()
5. FixedUpdate()
6. LateUpdate()
7. OnDisable()
Called when the script or GameObject is disabled.
void OnDisable()
{
Debug.Log("Script Disabled");
}
8. OnDestroy()
Called when the object is destroyed or the scene is closed.
void OnDestroy()
{
Debug.Log("Object Destroyed");
}
Important Behavioral Traits of MonoBehaviour
Attached to GameObjects
MonoBehaviour scripts must be attached to a GameObject to function in the scene. Simply defining a script doesn't make it run.
Can't be instantiated with new
You can’t use new to create an instance of a MonoBehaviour script. Instead, use AddComponent<T>() on a GameObject:
gameObject.AddComponent<ExampleScript>();
Unity Inspector Integration
Public fields (or fields marked with [SerializeField]) in MonoBehaviour scripts appear in the Unity Inspector, allowing for easy parameter tweaking.
public float speed = 5f; // Editable in Inspector
Coroutines Support
MonoBehaviour allows coroutines a way to run actions over time.
IEnumerator MoveOverTime()
{
yield return new WaitForSeconds(2f);
transform.Translate(Vector3.up);
}
Start a coroutine with.
StartCoroutine(MoveOverTime());
When is it Not Needed?
If your class,
- Doesn’t need Unity’s lifecycle methods.
- Doesn’t require Inspector exposure.
- Should be instantiated with new.
Then it’s better not to inherit from MonoBehaviour. This leads to better performance and cleaner code.
Common Mistakes to Avoid
- Writing a public constructor ExampleScript(), it won’t work.
- Assuming Update runs in inactive objects, it only runs in active GameObjects.
- Forgetting to check null references in Start() when accessing other components.
Summary Table
Method |
Purpose |
Called When |
Awake() |
Initial setup |
Once, when the object is loaded |
OnEnable() |
Logic when enabled |
Every time the object is activated |
Start() |
Initialization |
Before the first frame update |
Update() |
Per-frame logic |
Every frame |
FixedUpdate() |
Physics logic |
Every physics update (fixed interval) |
LateUpdate() |
Post-update logic |
After all the Update calls |
OnDisable() |
Cleanup before disabling |
When the object is deactivated |
OnDestroy() |
Final cleanup |
When the object is destroyed |
Conclusion
The MonoBehaviour class is the heart of Unity scripting. It enables you to create interactive, dynamic behaviors by responding to Unity’s lifecycle events. Mastering it unlocks the full potential of Unity’s component-based architecture, giving you control over gameplay mechanics, visuals, physics, and input.