public void Init() { mWorldContext = Substitute.For <IWorldContext>(); mWorldContext.GetEntitiesWithAll().ReturnsForAnyArgs(new List <EntityId> { }); mSystemManager = new SystemManager(mWorldContext); }
public void TestDisposableEntitiesCollectorSystem_ThereAreNoDisposableEntitiesAtInput_DoNothing() { mSystemManager.RegisterSystem(new PureUpdateSystemAdapter(mWorldContext, BuiltinSystems.DisposableEntitiesCollectorSystem)); int expectedNumOfDisposableEntities = 5; for (int i = 0; i < expectedNumOfDisposableEntities; ++i) { mWorldContext.CreateDisposableEntity(); } Assert.AreEqual(expectedNumOfDisposableEntities, mWorldContext.GetEntitiesWithAll(typeof(TDisposableComponent)).Count); mSystemManager.Init(); mSystemManager.Update(0.0f); Assert.AreEqual(0, mWorldContext.GetEntitiesWithAll(typeof(TDisposableComponent)).Count); }
public void TestGetEntitiesWithAll_PassNoArguments_ReturnsAllEntities() { List <EntityId> expectedEntities = new List <EntityId>(); for (int i = 0; i < 5; ++i) { expectedEntities.Add(mWorldContext.CreateEntity()); } Assert.DoesNotThrow(() => { var actualEntities = mWorldContext.GetEntitiesWithAll(); Assert.AreEqual(expectedEntities.Count, actualEntities.Count); for (int i = 0; i < expectedEntities.Count; ++i) { Assert.AreEqual(expectedEntities[i], actualEntities[i]); } }); }
/// <summary> /// The system is an update one that destroys all disposable entities at an end of a frame /// </summary> /// <param name="worldContext"></param> /// <param name="dt"></param> public static void DisposableEntitiesCollectorSystem(IWorldContext worldContext, float dt) { var disposableEntities = worldContext.GetEntitiesWithAll(typeof(TDisposableComponent)); for (int i = 0; i < disposableEntities.Count; ++i) { IEntity currEntity = worldContext.GetEntityById(disposableEntities[i]); if (currEntity.HasComponent <TEntityLifetimeComponent>()) { TEntityLifetimeComponent lifetimeData = currEntity.GetComponent <TEntityLifetimeComponent>(); currEntity.AddComponent(new TEntityLifetimeComponent { mCounter = lifetimeData.mCounter - 1 }); if (lifetimeData.mCounter > 0) { continue; } } worldContext.DestroyEntity(disposableEntities[i]); } }
public void Update(float deltaTime) { // get all entities with TRotatingCubeComponent component List <uint> entities = mWorldContext.GetEntitiesWithAll(typeof(TRotatingCubeComponent)); IEntity currEntity = null; for (int i = 0; i < entities.Count; ++i) { currEntity = mWorldContext.GetEntityById(entities[i]); // now we have two ways: strongly coupled code or use TinyECS approach // first version: /* * uncomment to test this version * * TViewComponent viewComponent = currEntity.GetComponent<TViewComponent>(); * * TRotatingCubeComponent rotatingCubeComponent = currEntity.GetComponent<TRotatingCubeComponent>(); * * viewComponent.mView.transform.Rotate(Vector3.up, rotatingCubeComponent.mSpeed); */ // second version (TinyECS approach) /* */ TRotatingCubeComponent rotatingCubeComponent = currEntity.GetComponent <TRotatingCubeComponent>(); TRotationComponent rotationComponent = currEntity.GetComponent <TRotationComponent>(); currEntity.AddComponent(new TRotationComponent { mRotation = rotationComponent.mRotation * Quaternion.Euler(0.0f, rotatingCubeComponent.mSpeed, 0.0f) }); } }