Exemple #1
0
 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);
    }