public void Execute(Entity entity, int index, ref Translation translation, ref GridPosition gridPosition, [ReadOnly] ref Movable movable) { if (movable.direction == Direction.NONE) { //Entity is static return; } //Spawn follow juice Entity newJuiceEntity = CommandBuffer.Instantiate(index, spawner.prefabFollowJuice); int layer = Root.ConfigManager.LayersConfig.LayerForEntity(EntityType.FOLLOW_JUICE); int2 juiceGridPosition = gridPosition.Value; float3 juiceTranslation = GridConfig.PositionForCoordinates(juiceGridPosition.x, juiceGridPosition.y, layer); CommandBuffer.SetComponent(index, newJuiceEntity, new GridPosition { Value = juiceGridPosition, layer = layer}); CommandBuffer.SetComponent(index, newJuiceEntity, new Translation() { Value = juiceTranslation}); int2 offset = GridHelpers.DirectionToInt2(movable.direction); //Wrap around the grid int wrappedX = gridPosition.Value.x + offset.x; int wrappedY = gridPosition.Value.y + offset.y; if (gridPosition.Value.x < 0) { wrappedX = GridConfig.width - 1; } else if (GridConfig.width <= gridPosition.Value.x) { wrappedX = 0; } else if (gridPosition.Value.y < 0) { wrappedY = GridConfig.height - 1; } else if (GridConfig.height <= gridPosition.Value.y) { wrappedY = 0; } gridPosition.Value = new int2(wrappedX, wrappedY); translation.Value = GridConfig.PositionForCoordinates(wrappedX, wrappedY, gridPosition.layer); }
private void Start() { entityManager = World.Active.EntityManager; Entity earthEntityPrefab = GameObjectConversionUtility.ConvertGameObjectHierarchy(earthPrefab, World.Active); Entity bodyEntityPrefab = GameObjectConversionUtility.ConvertGameObjectHierarchy(bodySegmentPrefab, World.Active); // var entityPrefabs = new RandomSelection[] // { // new RandomSelection(earthEntityPrefab, 1f), // }; var table = new Dictionary <int, Entity> { { 5, earthEntityPrefab }, { 3, bodyEntityPrefab }, }; //Generate grid for (int x = 0; x < GridConfig.width; x++) { for (int y = 0; y < GridConfig.height; y++) { // Entity randomPrefab = GetRandomValue(entityPrefabs); Entity randomPrefab = RandomWeighted.Roll(table); Entity instance = entityManager.Instantiate(randomPrefab); int z = Root.ConfigManager.LayersConfig.LayerForEntity(EntityType.EARTH); entityManager.SetComponentData(instance, new GridPosition { Value = new int2(x, y), layer = z }); float3 position = GridConfig.PositionForCoordinates(x, y, z); entityManager.SetComponentData(instance, new Translation { Value = position }); } } //Put head on a grid Entity headEntityPrafab = GameObjectConversionUtility.ConvertGameObjectHierarchy(headPrefab, World.Active); Entity headEntityInstance = entityManager.Instantiate(headEntityPrafab); int2 gridPositionHead = new int2(Mathf.RoundToInt(GridConfig.width / 2f), Mathf.RoundToInt(GridConfig.height / 2f)); int headVisualZ = Root.ConfigManager.LayersConfig.LayerForEntity(EntityType.HEAD); entityManager.SetComponentData(headEntityInstance, new GridPosition { Value = gridPositionHead, layer = headVisualZ }); //Translation is set in GridWrapping system for Move-Entities // float3 positionHead = GridConfig.PositionForCoordinates(gridPositionHead.x, gridPositionHead.y, headVisualZ); // entityManager.SetComponentData(headEntityInstance, new Translation {Value = positionHead}); //Add body segments for (int i = 1; i <= 1; i++) { Entity bodySegmentEntityInstance = entityManager.Instantiate(GameObjectConversionUtility.ConvertGameObjectHierarchy(bodySegmentPrefab, World.Active)); entityManager.SetComponentData(bodySegmentEntityInstance, new GridPosition { Value = new int2(gridPositionHead.x, gridPositionHead.y - i), layer = headVisualZ }); } Destroy(gameObject); }