Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
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 и все-все-все