Хабр Курсы для всех
РЕКЛАМА
Большая витрина: от крупнейших школ до частных авторов. Сравнивайте по цене, длительности, формату и выбирайте самый подходящий курс!
sealed class TweenPosition {
public Transform Target;
public Vector3 From;
public Vector3 To;
public float Time = 0f;
public float Factor = 0f;
}
sealed class TweenPositionSystem : IEcsRunSystem {
[EcsWorld]
GameWorld _world;
[EcsFilterInclude (typeof (TweenPosition))]
EcsFilter _positionFilter;
void IEcsRunSystem.Run () {
for (var i = 0; i < _positionFilter.EntitiesCount; i++) {
var entity = _positionFilter.Entities[i];
var tween = _world.GetComponent<TweenPosition> (entity);
tween.Factor += Time.deltaTime / tween.Time;
tween.Target.localPosition = Vector3.Lerp (tween.From, tween.To, tween.Factor);
if (tween.Factor >= 1f) {
tween.Target.localPosition = tween.To;
_world.RemoveComponent<TweenPosition> (entity);
}
}
}
}
var world = GameWorld.Instance;
_systems = new EcsSystems (world)
#if DEV_ENV
.Add (new Client.Systems.DebugHelpers.FpsCounterSystem ())
#endif
.Add (new UserSettingsSystem ())
.Add (new UserProgressSystem ())
.Add (new InitLevelSystem ())
.Add (new InitEnvironmentSystem ())
.Add (new InitStaticsSystem ())
.Add (new InitDynamicsSystem ())
.Add (new InitSwitchesSystem ())
.Add (new InitPlatformsSystem ())
.Add (new FinishLevelSystem ())
.Add (new GameUiBoxesSystem ())
.Add (new UserDesktopInputSystem ())
.Add (new UserMobileInputSystem ())
.Add (new FastTurnSystem ())
.Add (new TrapDetectSystem ())
.Add (new TweenPositionSystem ())
// ...
.Add (new InitGameUiSystem ());
_systems.Initialize ();
void Update () {
_systems.Run ();
}
Гибкость и масштабируемость (добавление новых, удаление старых систем и компонентов)
Но в этом и заключается основное различие между компонентной системой Unity и ECS — логика в ECS обязательно должна быть отделена от данных. Это позволяет очень гибко менять логику (даже удалять / добавлять её), не ломая данные
Все эти данные, сгруппированные в контейнеры, обрабатываются логикой, существующей исключительно в виде “Систем” — “чистых” классов с определенными методами для выполнения.
[EcsFilterInclude (typeof (IsBoxAnimationStarted))]
[EcsFilterExclude (typeof (TweenPosition))]
EcsFilter _tweenedBoxes;
Unity, ECS и все-все-все