ECS (Entity Component System)

Curso de Unity 3D

21.  
26.  
37.  

 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));
         })
    }
}
← Hacer un terreno
Cómo hacer un terreno con Unity →

Aviso Legal | Política de privacidad