ECS es un patrón de arquitectura generalmente usado en desarrollo de videojuegos que utiliza un diseño orientado a datos (DOTS) para optimizar el uso de CPU.
ECS es una nueva forma de programar videojuegos en Unity. Antes de ECS teníamos una forma de programar orientada a objetos:
- Player (GameObject)
- Renderer (MonoBehaviour).
- Physics (MonoBehaviour).
- Movement (MonoBehaviour).
Con ECS, dividiremos nuestro juego en 3 partes:
- Entities. Agrupan componentes. Son similares a los GameObjects, pero más ligeros.
- Components. Contienen datos. Al contrario que los MonoBehaviour, no tienen lógica.
- Systems. Definen el comportamiento de los componentes. Son los únicos componentes que tienen lógica.
La estructura quedaría así:
- Player (Entity)
- Renderer (data). → Asociado a un Render System.
- Physics (data). → Asociado a un Physics System.
- Movement (data). → Asociado a un Input System.
Ejemplo: rotar un cubo
Los datos:
[Serializable]
public struct RotationSpeed: IComponentData{
public float radiansPerSecond;
}
[RequiresEntityConversion]
public class RotationSpeedAuthoring: MonoBehaviour, IConvertGameObjectToEntity{
public float degreesPerSecond;
public void Convert(Entity entity, EntityManager manager, GameObjectConversionSystem conversion){
RotationSpeed data = new RotationSpeed{
radiansPerSecond = math.radians(degreesPerSecond)
}
manager.AddComponentData(entity, data);
}
}
El system:
En lugar de heredar de MonoBehaviour, hereda de ComponentSystem. Además, debemos inportar la librería Unity.Entities.
using UnityEngine;
using Unity.Entities;
using Unity.Mathematics;
using Unity.Transforms;
public class RotationSpeedSystem:ComponentSystem{
protected override void OnUpdate(){
Entities.ForEach((ref RotationSpeed rotationSpeed, ref Rotation rotation) => {
float deltaTime = Time.deltaTime;
rotation.Value = math.mul(math.normalize(rotation.value), quaternion.AxisAngle(math.up(), rotationSpeed.radiansPerSecond * deltaTime));
})
}
}