✅ Unity ECS на практике: Пишем первую систему
Следующий шаг
Разберем, как преобразовать обычные GameObject в Entity и работать с ними.
1. Гибридный подход (MonoBehaviour -> Entity)
- Добавь на GameObject компонент ConvertToEntity
- Он автоматически преобразует объект и его дочерние элементы при старте
2. Authoring (Создание данных в редакторе)
Пишем MonoBehaviour-обертку для визуальной настройки.
3. Система с зависимостями
Системы могут требовать наличие других компонентов.
4. Важные нюансы:
- RefRO - Read Only доступ (только чтение)
- RefRW - Read Write доступ (чтение и запись)
- Используй SystemAPI.Query для итерации по сущностям с нужными компонентами
- Все изменения автоматически параллелятся Burst компил💡 Совет: Начинай с малого — перенеси в ECS самые тяжелые части (частицы, ИИ). Не нужно переписывать всё сразу.
#Unity #ECS #DOTS #Performance #Burst
Следующий шаг
Разберем, как преобразовать обычные GameObject в Entity и работать с ними.
1. Гибридный подход (MonoBehaviour -> Entity)
- Добавь на GameObject компонент ConvertToEntity
- Он автоматически преобразует объект и его дочерние элементы при старте
2. Authoring (Создание данных в редакторе)
Пишем MonoBehaviour-обертку для визуальной настройки.
public class RotationSpeedAuthoring : MonoBehaviour
{
public float DegreesPerSecond = 360f;
}
// "Повар" преобразует Authoring в ComponentData
public class RotationSpeedAuthoringBaker : Baker<RotationSpeedAuthoring>
{
public override void Bake(RotationSpeedAuthoring authoring)
{
var entity = GetEntity(TransformUsageFlags.Dynamic);
AddComponent(entity, new RotationSpeed
{
RadiansPerSecond = math.radians(authoring.DegreesPerSecond)
});
}
}
3. Система с зависимостями
Системы могут требовать наличие других компонентов.
// Система, которая работает только с объектами, у которых есть RotationSpeed и Rotation
[UpdateInGroup(typeof(SimulationSystemGroup))]
public partial struct MyRotationSystem : ISystem
{
public void OnUpdate(ref SystemState state)
{
foreach (var (transform, speed) in
SystemAPI.Query<RefRW<LocalTransform>, RefRO<RotationSpeed>>())
{
transform.ValueRW = transform.ValueRO.RotateY(
speed.ValueRO.RadiansPerSecond * SystemAPI.Time.DeltaTime
);
}
}
}
4. Важные нюансы:
- RefRO - Read Only доступ (только чтение)
- RefRW - Read Write доступ (чтение и запись)
- Используй SystemAPI.Query для итерации по сущностям с нужными компонентами
- Все изменения автоматически параллелятся Burst компил💡 Совет: Начинай с малого — перенеси в ECS самые тяжелые части (частицы, ИИ). Не нужно переписывать всё сразу.
#Unity #ECS #DOTS #Performance #Burst
🔥5 1