# OnUpdate(ref SystemState)

> Implement OnUpdate to perform the major work of this system.

## Definition

* **Type:** Method
* **Namespace:** [Unity.Entities](/engine/7000.0/script-reference/unity/entities.md)
* **Assembly:** UnityEngine.EntitiesModule

## OnUpdate(SystemState)

```csharp
void OnUpdate(ref SystemState state)
```

### Parameters

**** (\[SystemState]\(/engine/7000.0/script-reference/unity/entities/systemstate)): The [SystemState](/engine/7000.0/script-reference/unity/entities/systemstate.md) backing this system instance

### Remarks

By default, the system invokes `OnUpdate` once every frame on the main thread. To skip OnUpdate if all of the system's [EntityQueries] are empty, use the [RequireMatchingQueriesForUpdateAttribute]. To limit when OnUpdate is invoked, you can specify components that must exist, or queries that match specific Entities. To do this, call [SystemState.RequireForUpdate](/engine/7000.0/script-reference/unity/entities/systemstate/requireforupdate.md) or [SystemState.RequireForUpdate](/engine/7000.0/script-reference/unity/entities/systemstate/requireforupdate.md) in the system's OnCreate method. For more information, see [SystemState.ShouldRunSystem](/engine/7000.0/script-reference/unity/entities/systemstate/shouldrunsystem.md).

You can instantiate and schedule an [IJobChunk](/engine/7000.0/script-reference/unity/entities/ijobchunk.md) instance; you can use the [C# Job System] or you can perform work on the main thread. If you call [EntityManager](/engine/7000.0/script-reference/unity/entities/entitymanager.md) methods that perform structural changes on the main thread, be sure to arrange the system order to minimize the performance impact of the resulting [sync points].

[sync points]: xref:concepts-structural-changes

[C# Job System]: https://docs.unity3d.com/Manual/JobSystem.html

[EntityQueries]: xref:Unity.Entities.EntityQuery

[RequireMatchingQueriesForUpdateAttribute]: xref:Unity.Entities.RequireMatchingQueriesForUpdateAttribute
