Example #1
0
    // Use this for initialization
    void Start()
    {
        selectedColor = new Texture2D(32,32);
        selectedColorStyle = new GUIStyle();

        sheetData = new SpriteSheetData();
        sheetData.Initialize();
        SetPalettes();
        canvas.material.mainTexture = sheetData.buffered;
        //NewCanvas();

        //GUI Elements
        Console.Bind("spriteEdit", 0, 0, 250, 120);
        Window newWindow = new Window();
        newWindow.Initialize("spriteEdit", 0, 0, 120, 25, Toolbar, Window.Align.TopLeft);
        GUIManager.windows.Add(newWindow);
        newWindow = new Window();
        newWindow.Initialize("spriteEdit", 0, 0, 290, 90, Palette, Window.Align.BottomLeft);
        GUIManager.windows.Add(newWindow);
        newWindow = new Window();
        newWindow.Initialize("spriteEdit", 0, 0, 138, 74, Swatches, Window.Align.Bottom);
        GUIManager.windows.Add(newWindow);
        mainColor = new RGBColor();
        mainColor.SetColor(0,0,0);

        selectedColorStyle.normal.background = selectedColor;
    }
Example #2
0
        public static SpriteSheetData Parse(string rawfile)
        {
            SpriteSheetFileReader sfr = new SpriteSheetFileReader(rawfile);
            SpriteSheetData       sd  = new SpriteSheetData(sfr);

            return(sd);
        }
Example #3
0
        public Animation(Texture2D texture, SpriteSheetData spriteSheetData, int direction = 0, bool isPlayer = false)
        {
            var spriteWidth   = spriteSheetData.Width;
            var spriteHeight  = spriteSheetData.Height;
            var objectTexture = texture;
            var objectAtlas   = TextureAtlas.Create("objectAtlas", objectTexture, spriteWidth, spriteHeight);

            var animationFactory = new SpriteSheetAnimationFactory(objectAtlas);

            for (int i = 0; i < spriteSheetData.AnimationName.Count; i++)
            {
                animationFactory.Add(spriteSheetData.AnimationName[i], new SpriteSheetAnimationData(spriteSheetData.FrameArray[i], spriteSheetData.FrameDuration[i], spriteSheetData.IsLooping[i]));
            }

            if (isPlayer)
            {
                objectAnimated = new AnimatedSprite(animationFactory, HUD.PlayerCurrentState.ToString());
            }
            else
            {
                objectAnimated = new AnimatedSprite(animationFactory, "Idle");
            }

            objectSprite        = objectAnimated;
            objectSprite.Origin = Vector2.Zero;

            if (direction == (int)Direction.Right)
            {
                objectAnimated.Effect = SpriteEffects.None;
            }
            else
            {
                objectAnimated.Effect = SpriteEffects.FlipHorizontally;
            }
        }
Example #4
0
        public override void Initialize()
        {
            speed = 1;

            for (var i = 0; i < 64; i++)
            {
                posX[i] = position.X;
                posY[i] = position.Y;
            }

            spriteSheetData = new SpriteSheetData(16, 24,
                                                  new List <string> {
                "Down", "DownRight", "Right", "UpRight", "Up", "UpLeft", "Left", "DownLeft"
            },
                                                  new List <int[]> {
                new[] { 0, 1 }, new[] { 2, 3 }, new[] { 4, 5 }, new[] { 6, 7 }, new[] { 8, 9 }, new[] { 10, 11 }, new[] { 12, 13 }, new[] { 14, 15 }
            },
                                                  new List <float> {
                0.2f, 0.2f, 0.2f, 0.2f, 0.2f, 0.2f, 0.2f, 0.2f
            },
                                                  new List <bool> {
                true, true, true, true, true, true, true, true
            });
            base.Initialize();
        }
        public void ShouldReadSpriteSheetFile()
        {
            string          rawFile         = Helpers.Helpers.LoadFile(@"Player04.png.meta");
            SpriteSheetData spriteSheetData = SpriteParser.Parse(rawFile);

            spriteSheetData.FileFormatVersion.Should().Be("2");
            spriteSheetData.FileGuid.Should().Be("9a3cf21915996f441b213e88de546e32");
        }
        public void ShouldMapSpriteNames()
        {
            string          rawFile         = Helpers.Helpers.LoadFile(@"Player04.png.meta");
            SpriteSheetData spriteSheetData = SpriteParser.Parse(rawFile);

            spriteSheetData.NamesMap.Should().HaveCount(66);
            spriteSheetData.NamesMap["PL04_Left_Walk0"].Should().Be("21300000");
            spriteSheetData.NamesMap["PL04_DownRight_Walk0"].Should().Be("21300022");
        }
        public void ShouldPopulatePivot()
        {
            string          rawFile         = Helpers.Helpers.LoadFile(@"Player04.png.meta");
            SpriteSheetData spriteSheetData = SpriteParser.Parse(rawFile);
            SpriteData      sd = spriteSheetData.SpritesMap["PL04_Left_Walk0"];

            sd.Pivot.X.Should().Be(0.5f);
            sd.Pivot.Y.Should().Be(0);
        }
        public void ShouldGetAnimationFramesATTStab()
        {
            string          rawFile         = Helpers.Helpers.LoadFile(@"Player04.png.meta");
            SpriteSheetData spriteSheetData = SpriteParser.Parse(rawFile);
            List <string>   frames          = spriteSheetData.GetAnimationFrames("PL04_UpLeft_ATTStab").ToList();

            frames.Should().HaveCount(2);
            frames[0].Should().Be("PL04_UpLeft_ATTStab1");
            frames[1].Should().Be("PL04_UpLeft_ATTStab2");
        }
        public void ShouldGetAnimationFramesDownRight()
        {
            string          rawFile         = Helpers.Helpers.LoadFile(@"Player04.png.meta");
            SpriteSheetData spriteSheetData = SpriteParser.Parse(rawFile);
            List <string>   frames          = spriteSheetData.GetAnimationFrames("PL04_DownRight_Walk").ToList();

            frames.Should().HaveCount(3);
            frames[0].Should().Be("PL04_DownRight_Walk0");
            frames[1].Should().Be("PL04_DownRight_Walk1");
            frames[2].Should().Be("PL04_DownRight_Walk2");
        }
        public void ShouldPopulateRect()
        {
            string          rawFile         = Helpers.Helpers.LoadFile(@"Player04.png.meta");
            SpriteSheetData spriteSheetData = SpriteParser.Parse(rawFile);
            SpriteData      sd = spriteSheetData.SpritesMap["PL04_Left_Walk0"];

            sd.Rect.X.Should().Be(5);
            sd.Rect.Y.Should().Be(473);
            sd.Rect.Width.Should().Be(10);
            sd.Rect.Height.Should().Be(35);
        }
Example #11
0
        internal Dictionary <string, PixelSet> CutFrames(SpriteSheetData spriteSheetData)
        {
            Dictionary <string, PixelSet> pixelSet = new Dictionary <string, PixelSet>();

            Dictionary <string, SpriteData> spriteFrames = spriteSheetData.SpritesMap;

            foreach (KeyValuePair <string, SpriteData> kvp in spriteFrames)
            {
                PixelSet set = Cut(kvp.Value.Rect);
                pixelSet.Add(kvp.Key, set);
            }
            return(pixelSet);
        }
Example #12
0
 public override void Initialize()
 {
     spriteSheetData = new SpriteSheetData(16, 24,
                                           new List <string> {
         "Down", "DownRight", "Right", "UpRight", "Up", "UpLeft", "Left", "DownLeft"
     },
                                           new List <int[]> {
         new[] { 0, 1 }, new[] { 2, 3 }, new[] { 4, 5 }, new[] { 6, 7 }, new[] { 8, 9 }, new[] { 10, 11 }, new[] { 12, 13 }, new[] { 14, 15 }
     },
                                           new List <float> {
         0.2f, 0.2f, 0.2f, 0.2f, 0.2f, 0.2f, 0.2f, 0.2f
     },
                                           new List <bool> {
         true, true, true, true, true, true, true, true
     });
 }
Example #13
0
        private static GameAsset LoadSpriteSheet(SpriteSheetData sheet_data)
        {
            var sheet = new SpriteSheet(sheet_data.ImageData, sheet_data.ImageWidth, sheet_data.ImageHeight, sheet_data.CellSize)
            {
                Id = sheet_data.Id
            };

            if (sheet_data.SpriteMap.Count > 0)
            {
                foreach (var sprite_pair in sheet_data.SpriteMap)
                {
                    sheet.MapNamedSprite(sprite_pair.Key, sprite_pair.Value);
                }
            }

            return(sheet);
        }
        public void ShouldCreateSprite()
        {
            string          rawFile         = Helpers.Helpers.LoadFile(@"Player04.png.meta");
            SpriteSheetData spriteSheetData = SpriteParser.Parse(rawFile);

            spriteSheetData.SpritesMap.Should().HaveCount(64);

            SpriteData sd = spriteSheetData.SpritesMap["PL04_Left_Walk0"];

            sd.Name.Should().Be("PL04_Left_Walk0");
            sd.SpriteID.Should().Be("2f9a5b012f5af2747902bba879ef1838");
            sd.Alignment.Should().Be(7);

            sd = spriteSheetData.SpritesMap["PL04_DownLeft_ATTSwipe1"];
            sd.Name.Should().Be("PL04_DownLeft_ATTSwipe1");
            sd.SpriteID.Should().Be("a358f9531f7322f4881de90b59bd397d");
            sd.Alignment.Should().Be(9);
        }
Example #15
0
        public static SpriteSheetData GetSpriteData(string path, TextAsset spriteSheetDataFile)
        {
            if (spriteSheetDataFile != null)
            {
                string[] entries = spriteSheetDataFile.text.Split(
                    new string[] { "\n", "\r" }, StringSplitOptions.RemoveEmptyEntries);

                string entry = entries.FirstOrDefault(x => x.StartsWith(Path.GetFileName(path)));

                if (!string.IsNullOrEmpty(entry))
                {
                    string[] entryData = entry.Split(',');
                    var      data      = new SpriteSheetData();
                    try
                    {
                        float width  = int.Parse(entryData[1]);
                        float height = int.Parse(entryData[2]);
                        data.Size = new Vector2(width, height);

                        // number of frames is optional
                        uint frames = 0;
                        if (entryData.Length > 3)
                        {
                            if (uint.TryParse(entryData[3], out frames))
                            {
                                data.Frames = frames;
                            }
                        }

                        return(data);
                    }
                    catch
                    {
                        Debug.LogError("Invalid sprite data at line: " + Array.IndexOf(entries, entry) + ", (" + entry + ")");
                    }
                }
            }

            return(null);
        }
Example #16
0
        public static void Main(string[] args)
        {
            var parameters = new SpriteSheetData
            {
                Id = 1,
                SpriteSheetTextureName = "characters",
                Frames = new SpriteSheetFrame[73]
            };

            for (int i = 0; i < 23; i++)
            {
                parameters.Frames[i] = new SpriteSheetFrame(i * 32, 0, 32, 32);
            }

            for (int i = 0; i < 23; i++)
            {
                parameters.Frames[i + 23] = new SpriteSheetFrame(i * 32, 1, 32, 32);
            }

            for (int i = 0; i < 23; i++)
            {
                parameters.Frames[i + 46] = new SpriteSheetFrame(i * 32, 2, 32, 32);
            }

            for (int i = 0; i < 4; i++)
            {
                parameters.Frames[i + 69] = new SpriteSheetFrame(i * 32, 3, 32, 32);
            }

            string json = JsonConvert.SerializeObject(parameters, Formatting.Indented);

            var animDefs = new AnimationDefinitionData[11];
            var animDef  = new AnimationDefinitionData("WalkingBabyRight")
            {
                Frames = new AnimationFrame[18]
            };

            for (int i = 0; i < 18; i++)
            {
                animDef.Frames[i] = new AnimationFrame(1, i, 200.0d);
            }
            animDefs[0] = animDef;

            animDef = new AnimationDefinitionData("WalkingBabyLeft")
            {
                Frames = new AnimationFrame[18]
            };
            for (int i = 0; i < 18; i++)
            {
                animDef.Frames[i] = new AnimationFrame(1, i, 200.0d, SpriteEffects.FlipHorizontally);
            }
            animDefs[1] = animDef;

            animDef = new AnimationDefinitionData("WalkingBabyUp")
            {
                Frames = new AnimationFrame[5]
            };
            for (int i = 0; i < 5; i++)
            {
                animDef.Frames[i] = new AnimationFrame(1, i + 18, 200.0d, SpriteEffects.FlipHorizontally);
            }
            animDefs[2] = animDef;

            animDef = new AnimationDefinitionData("WalkingKingRight")
            {
                Frames = new AnimationFrame[18]
            };
            for (int i = 0; i < 18; i++)
            {
                animDef.Frames[i] = new AnimationFrame(1, i + 23, 200.0d);
            }
            animDefs[3] = animDef;

            animDef = new AnimationDefinitionData("WalkingKingLeft")
            {
                Frames = new AnimationFrame[18]
            };
            for (int i = 0; i < 18; i++)
            {
                animDef.Frames[i] = new AnimationFrame(1, i + 23, 200.0d, SpriteEffects.FlipHorizontally);
            }
            animDefs[4] = animDef;

            animDef = new AnimationDefinitionData("WalkingKingUp")
            {
                Frames = new AnimationFrame[5]
            };
            for (int i = 0; i < 5; i++)
            {
                animDef.Frames[i] = new AnimationFrame(1, i + 23 + 18, 200.0d, SpriteEffects.FlipHorizontally);
            }
            animDefs[5] = animDef;

            animDef = new AnimationDefinitionData("WalkingExplorerRight")
            {
                Frames = new AnimationFrame[18]
            };
            for (int i = 0; i < 18; i++)
            {
                animDef.Frames[i] = new AnimationFrame(1, i + 46, 200.0d);
            }
            animDefs[6] = animDef;

            animDef = new AnimationDefinitionData("WalkingExplorerLeft")
            {
                Frames = new AnimationFrame[18]
            };
            for (int i = 0; i < 18; i++)
            {
                animDef.Frames[i] = new AnimationFrame(1, i + 46, 200.0d, SpriteEffects.FlipHorizontally);
            }
            animDefs[7] = animDef;

            animDef = new AnimationDefinitionData("WalkingExplorerUp")
            {
                Frames = new AnimationFrame[5]
            };
            for (int i = 0; i < 5; i++)
            {
                animDef.Frames[i] = new AnimationFrame(1, i + 46 + 18, 200.0d, SpriteEffects.FlipHorizontally);
            }
            animDefs[8] = animDef;

            animDef = new AnimationDefinitionData("MovingSnakeRight")
            {
                Frames = new AnimationFrame[4]
            };
            for (int i = 0; i < 4; i++)
            {
                animDef.Frames[i] = new AnimationFrame(1, i + 69, 200.0d);
            }
            animDefs[9] = animDef;

            animDef = new AnimationDefinitionData("MovingSnakeLeft")
            {
                Frames = new AnimationFrame[4]
            };
            for (int i = 0; i < 4; i++)
            {
                animDef.Frames[i] = new AnimationFrame(1, i + 69, 200.0d, SpriteEffects.FlipHorizontally);
            }
            animDefs[10] = animDef;

            json = JsonConvert.SerializeObject(animDefs, Formatting.Indented);
        }
Example #17
0
        public static void ApplyDefaultTextureSettings(
            SpriteSettings prefs,
            bool changePivot,
            bool changePackingTag)
        {
            if (prefs == null)
            {
                return;
            }

            foreach (var obj in Selection.objects)
            {
                if (!AssetDatabase.Contains(obj))
                {
                    continue;
                }

                string path = AssetDatabase.GetAssetPath(obj);

                var importer = AssetImporter.GetAtPath(path) as TextureImporter;
                if (importer == null)
                {
                    continue;
                }

                // Try to slice it
                var             fileName        = Path.GetFileNameWithoutExtension(path);
                SpriteSheetData spriteSheetData = GetSpriteData(path, prefs.SpritesheetDataFile);

                // When we have text file data
                if (spriteSheetData != null)
                {
                    var gridRects = InternalSpriteUtility.GenerateGridSpriteRectangles(
                        AssetDatabase.LoadAssetAtPath(path, typeof(Texture2D)) as Texture2D,
                        Vector2.zero, spriteSheetData.Size, Vector2.zero);

                    var spriteSheet = importer.spritesheet ?? new SpriteMetaData[gridRects.Length];

                    if (importer.spritesheet != null)
                    {
                        spriteSheet = spriteSheet.Concat(new SpriteMetaData[Mathf.Max(0, gridRects.Length - importer.spritesheet.Length)]).ToArray();
                    }

                    for (var i = 0; i < spriteSheet.Length; i++)
                    {
                        bool sliceExists = importer.spritesheet != null && i < importer.spritesheet.Length;
                        bool changed     = changePivot || !(sliceExists);
                        spriteSheet[i] = new SpriteMetaData
                        {
                            alignment = changed ? (int)prefs.Pivot : spriteSheet[i].alignment,
                            pivot     = changed ? prefs.CustomPivot : spriteSheet[i].pivot,
                            name      = sliceExists ? spriteSheet[i].name : fileName + "_" + Array.IndexOf(gridRects, gridRects[i]),
                            rect      = gridRects[i]
                        };
                    }

                    // If we don't do this it won't update the new sprite meta data
                    importer.spriteImportMode = SpriteImportMode.Single;
                    importer.spriteImportMode = SpriteImportMode.Multiple;

                    if (spriteSheetData.Frames > 0)
                    {
                        importer.spritesheet = spriteSheet.Take((int)spriteSheetData.Frames).ToArray();
                    }
                    else
                    {
                        importer.spritesheet = spriteSheet;
                    }
                }
                else if (importer.spritesheet != null && changePivot) // for existing sliced sheets without data in the text file and wantint to change pivot
                {
                    var spriteSheet = new SpriteMetaData[importer.spritesheet.Length];

                    for (int i = 0; i < importer.spritesheet.Length; i++)
                    {
                        var spriteMetaData = importer.spritesheet[i];
                        spriteMetaData.alignment = (int)prefs.Pivot;
                        spriteMetaData.pivot     = prefs.CustomPivot;
                        spriteSheet[i]           = spriteMetaData;
                    }

                    importer.spritesheet = spriteSheet;
                }
                else
                {
                    importer.spriteImportMode = SpriteImportMode.Single;
                }

                TextureImporterSettings settings = new TextureImporterSettings();
                importer.ReadTextureSettings(settings);

                settings.filterMode     = prefs.FilterMode;
                settings.wrapMode       = prefs.WrapMode;
                settings.mipmapEnabled  = prefs.GenerateMipMaps;
                settings.textureFormat  = prefs.TextureFormat;
                settings.maxTextureSize = prefs.MaxSize;

                settings.spritePixelsPerUnit = prefs.PixelsPerUnit;

                settings.spriteExtrude  = (uint)Mathf.Clamp(prefs.ExtrudeEdges, 0, 32);
                settings.spriteMeshType = prefs.SpriteMeshType;

                if (changePivot)
                {
                    settings.spriteAlignment = (int)prefs.Pivot;
                    if (prefs.Pivot == SpriteAlignment.Custom)
                    {
                        settings.spritePivot = prefs.CustomPivot;
                    }
                }

                if (changePackingTag)
                {
                    importer.spritePackingTag = prefs.PackingTag;
                }

                importer.SetTextureSettings(settings);
#if UNITY_5_0
                importer.SaveAndReimport();
#else
                AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate);
#endif
                EditorUtility.SetDirty(obj);
            }
        }
        private void InportFromUnity(object sender, EventArgs e)
        {
            string          filename        = @"C:\GitHub\eWolfPixel\Pixel\eWolfUnity3DParser.UnitTests\TestingData\Player04.png";
            SpriteSheetData spriteSheetData = SpriteParser.ParseLoad(filename + ".meta");
            // spin up a bitmap reader to read the image and create pixelSets for each sprite.
            PixelSet image = ServiceLocator.Instance.GetService <IPixelLoader>().LoadImage(filename);
            Dictionary <string, PixelSet> frames = image.CutFrames(spriteSheetData);

            ProjectHolder    projectHolder = ServiceLocator.Instance.GetService <ProjectHolder>();
            AnimationDetails ad            = new AnimationDetails($"Walk", "\\Root\\Char1");

            projectHolder.Items.Add(ad);
            ad.PostLoadFix();

            // PL04_DownLeft_Walk0

            List <PixelSet> leftWalk = new List <PixelSet>();

            leftWalk.Add(frames["PL04_Left_Walk0"]);
            leftWalk.Add(frames["PL04_Left_Walk1"]);
            leftWalk.Add(frames["PL04_Left_Walk0"]);
            leftWalk.Add(frames["PL04_Left_Walk2"]);
            AddFrameToAnim(Directions8Way.Left, ad, leftWalk);

            List <PixelSet> downLeftWalk = new List <PixelSet>();

            downLeftWalk.Add(frames["PL04_DownLeft_Walk0"]);
            downLeftWalk.Add(frames["PL04_DownLeft_Walk1"]);
            downLeftWalk.Add(frames["PL04_DownLeft_Walk0"]);
            downLeftWalk.Add(frames["PL04_DownLeft_Walk2"]);
            AddFrameToAnim(Directions8Way.DownLeft, ad, downLeftWalk);

            List <PixelSet> downRightWalk = new List <PixelSet>();

            downRightWalk.Add(frames["PL04_DownRight_Walk0"]);
            downRightWalk.Add(frames["PL04_DownRight_Walk1"]);
            downRightWalk.Add(frames["PL04_DownRight_Walk0"]);
            downRightWalk.Add(frames["PL04_DownRight_Walk2"]);
            AddFrameToAnim(Directions8Way.DownRight, ad, downRightWalk);

            List <PixelSet> rightWalk = new List <PixelSet>();

            rightWalk.Add(frames["PL04_Right_Walk0"]);
            rightWalk.Add(frames["PL04_Right_Walk1"]);
            rightWalk.Add(frames["PL04_Right_Walk0"]);
            rightWalk.Add(frames["PL04_Right_Walk2"]);
            AddFrameToAnim(Directions8Way.Right, ad, rightWalk);

            List <PixelSet> upLeftWalk = new List <PixelSet>();

            upLeftWalk.Add(frames["PL04_UpLeft_Walk0"]);
            upLeftWalk.Add(frames["PL04_UpLeft_Walk1"]);
            upLeftWalk.Add(frames["PL04_UpLeft_Walk0"]);
            upLeftWalk.Add(frames["PL04_UpLeft_Walk2"]);
            AddFrameToAnim(Directions8Way.UpLeft, ad, upLeftWalk);

            List <PixelSet> upWalk = new List <PixelSet>();

            upWalk.Add(frames["PL04_Up_Walk0"]);
            upWalk.Add(frames["PL04_Up_Walk1"]);
            upWalk.Add(frames["PL04_Up_Walk0"]);
            upWalk.Add(frames["PL04_Up_Walk2"]);
            AddFrameToAnim(Directions8Way.Up, ad, upWalk);

            List <PixelSet> downWalk = new List <PixelSet>();

            downWalk.Add(frames["PL04_Down_Walk0"]);
            downWalk.Add(frames["PL04_Down_Walk1"]);
            downWalk.Add(frames["PL04_Down_Walk0"]);
            downWalk.Add(frames["PL04_Down_Walk2"]);
            AddFrameToAnim(Directions8Way.Down, ad, downWalk);

            List <PixelSet> upRightWalk = new List <PixelSet>();

            upRightWalk.Add(frames["PL04_UpRight_Walk0"]);
            upRightWalk.Add(frames["PL04_UpRight_Walk1"]);
            upRightWalk.Add(frames["PL04_UpRight_Walk0"]);
            upRightWalk.Add(frames["PL04_UpRight_Walk2"]);
            AddFrameToAnim(Directions8Way.UpRight, ad, upRightWalk);

            ad.Save(projectHolder.ProjectPath);
        }
Example #19
0
    // Start is called before the first frame update
    private void Awake()
    {
        EntityManager   manager   = World.DefaultGameObjectInjectionWorld.EntityManager;
        EntityArchetype archetype = manager.CreateArchetype(
            typeof(Translation),
            typeof(UniqueAnimationData),
            typeof(AnimationClip),
            typeof(SpriteSheetData),
            typeof(MeshData)
            );
        NativeArray <Entity> entities = new NativeArray <Entity>(10000, Allocator.Temp);

        manager.CreateEntity(archetype, entities);
        MeshData mesh = new MeshData(1, 1, 0);

        foreach (Entity e in entities)
        {
            manager.SetComponentData(e,
                                     new Translation()
            {
                Value = new float3(Random.Range(-11f, 10.5f), Random.Range(-5f, 4.5f), 0)
            });

            manager.SetSharedComponentData(e, mesh);



            //
            //Calculate uvs
            //
            //Width and height will be static per sheet, TODO cache these


            SpriteSheetData spriteSheetData = new SpriteSheetData()
            {
                TotalCells  = 16,
                CellsPerRow = 4,
                GridUVs     = new Vector2()
            };
            //
            //Calculate uvs
            //
            //Width and height will be static per sheet, TODO cache these
            float uvWidth  = 1f / spriteSheetData.CellsPerRow;
            float uvHeight = 1 / math.ceil(((float)spriteSheetData.TotalCells / (float)spriteSheetData.CellsPerRow));
            spriteSheetData.GridUVs.x = uvWidth;
            spriteSheetData.GridUVs.y = uvHeight;
            manager.SetComponentData(e,
                                     new SpriteSheetData()
            {
                TotalCells  = spriteSheetData.TotalCells,
                CellsPerRow = spriteSheetData.CellsPerRow,
                GridUVs     = spriteSheetData.GridUVs
            });

            var animationClips =
                manager.AddBuffer <AnimationClip>(
                    e); //TODO make this a shared buffer between all meeple entities if possible??
            AnimationClip walkDown = new AnimationClip(AnimationDirection.Right, 0, 4, .25f);
            AnimationClip walkLeft = new AnimationClip(AnimationDirection.Right, 4, 4, 1);
            animationClips.Add(walkDown);
            animationClips.Add(walkLeft);

            manager.SetComponentData(e,
                                     new UniqueAnimationData()
            {
                currentClip  = Random.Range(0, 2) == 0 ? walkDown : walkLeft,
                currentFrame = Random.Range(0, 4),
                FrameTimer   = Random.Range(0f, 1f),
                offsetUVs    = new Vector2()
            });
        }

        entities.Dispose();
    }