Understanding Entity Component System Architecture in Unity3D
Unity3D's Entity Component System (ECS) architecture represents a significant shift from traditional object-oriented game development approaches. This architecture separates game objects into three distinct elements: entities, components, and systems.
Entities serve as simple identifiers without inherent behavior or data:
public struct GameEntity
{
public uint identifier;
}
Components contain the actual data and functionality:
public struct TransformData : IComponentData
{
public float3 position;
public quaternion rotation;
}
public class PhysicsComponent : MonoBehaviour, IConvertGameObjectToEntity
{
public float mass;
public void Convert(Entity entity, EntityManager manager, GameObjectConversionSystem conversionSystem)
{
manager.AddComponentData(entity, new PhysicsProperties { massValue = mass });
}
}
Systems process components and implement game logic:
public class MovementSystem : SystemBase
{
protected override void OnUpdate()
{
float timeStep = Time.DeltaTime;
Entities.ForEach((ref TransformData transform, in VelocityData velocity) =>
{
transform.position += velocity.direction * velocity.speed * timeStep;
}).ScheduleParallel();
}
}
The EntityManager handles entity lifecycle and component management:
public class SceneController : MonoBehaviour
{
private EntityManager entityController;
private void Initialize()
{
entityController = World.DefaultGameObjectInjectionWorld.EntityManager;
Entity newEntity = entityController.CreateEntity(
typeof(TransformData),
typeof(VelocityData));
entityController.SetComponentData(newEntity, new TransformData { position = float3.zero });
entityController.SetComponentData(newEntity, new VelocityData { speed = 2.5f });
}
}
To implement a basic moving object:
- Create an empty GameObject with a SceneController script
- Add a cube with Physics components
- Attach a conversion component to link to ECS
- The system will automatical process movement each frame