⚙️ Unity editor module ⚙️

Unity интеграция

Пример интеграции StaticEcs с Unity:

using System;
using FFS.Libraries.StaticEcs;
using FFS.Libraries.StaticEcs.Unity;
using UnityEngine;
using Object = UnityEngine.Object;
using Random = UnityEngine.Random;

// Определяем тип мира с именем для редактора
[StaticEcsEditorName("World")]
public struct WT : IWorldType { }
public abstract class W : World<WT> { }

// Определяем системы
public struct GameSystems : ISystemsType { }
public abstract class GameSys : W.Systems<GameSystems> { }

// Компоненты
public struct Position : IComponent {
    public Transform Value;
}

public struct Direction : IComponent {
    public Vector3 Value;
}

public struct Velocity : IComponent {
    public float Value;
}

// Данные сцены — передаются из MonoBehaviour через ресурс
[Serializable]
public class SceneData : IResource {
    public GameObject EntityPrefab;
}

// Система создания сущностей
public struct CreateRandomEntities : ISystem {
    public void Init() {
        ref var sceneData = ref W.GetResource<SceneData>();
        for (var i = 0; i < 100; i++) {
            var go = Object.Instantiate(sceneData.EntityPrefab);
            go.transform.position = new Vector3(Random.Range(0, 50), 0, Random.Range(0, 50));
            W.NewEntity<Default>().Set(
                new Position { Value = go.transform },
                new Direction { Value = new Vector3(Random.Range(-1f, 1f), 0, Random.Range(-1f, 1f)) },
                new Velocity { Value = 2f }
            );
        }
    }
}

// Система обновления позиций
public struct UpdatePositions : ISystem {
    public void Update() {
        W.Query().For(
            static (ref Position position, in Velocity velocity, in Direction direction) => {
                position.Value.position += direction.Value * (Time.deltaTime * velocity.Value);
            }
        );
    }
}

// MonoBehaviour точка входа
public class Startup : MonoBehaviour {
    public SceneData sceneData;

    private void Start() {
        // Создаём мир и системы
        W.Create(WorldConfig.Default());
        GameSys.Create();

        // Регистрируем все типы и подключаем отладку (Unity модуль)
        W.Types().RegisterAll();
        UnityEventTypes.Register<WT>(); // Регистрирует все события и компоненты Unity
        EcsDebug<WT>.AddWorld<GameSystems>();

        // Передаём данные сцены через ресурс
        W.SetResource(sceneData);

        // Создаём и настраиваем системы
        GameSys.Add(new CreateRandomEntities(), order: -10)
            .Add(new UpdatePositions(), order: 0);

        // Инициализируем мир и системы
        W.Initialize();
        GameSys.Initialize();
    }

    private void Update() {
        GameSys.Update();
        // Продвижение трекинга изменений (изменения видны в следующем кадре)
        W.Tick();
    }

    private void OnDestroy() {
        GameSys.Destroy();
        W.Destroy();
    }
}

This site uses Just the Docs, a documentation theme for Jekyll.