public virtual void Update(InputComponent input, FieldCamera camera)
        {
            _spriteComponent.Entity.Transform.Position = _unmodifiedPosition;
            MoveCharacter();
            DetermineSprite(camera);
            _unmodifiedPosition = _spriteComponent.Entity.Transform.Position;
            _currentTicks      += Game.UpdateTime.Elapsed.TotalMilliseconds;
            if (_currentTicks >= 125) // Each animation takes 0.125 seconds to complete. Only change sprite after this time elapsed
            {
                var spriteProvider = _spriteComponent.SpriteProvider as SpriteFromSheet;
                spriteProvider.CurrentFrame = _nextAnimation.SpriteSheetId;
                _previousAnimation          = _nextAnimation;
                _nextAnimation = null;
                _currentTicks  = 0;
            }
            this.Direction = _previousAnimation.Direction;

            _spriteComponent.Entity.Transform.Rotation = camera.CameraTarget.Rotation; // Keep sprite rotated towards camera. TODO: Update Sprite's Y Value to scale properly with camera angle.
            var cameraEntity = Core.Instance.MainCamera.Entity.Transform;
            var direction    = (Entity.Transform.Position - cameraEntity.LocalToWorld(cameraEntity.Position));

            direction.Normalize();

            _spriteComponent.Entity.Transform.Position -= 0.3f * direction;
        }
        protected virtual SpriteFromSheet BuildSpriteSheet()
        {
            var ss = new SpriteSheet();
            //Each action has 8 directions * actionCount sprites
            int spriteSheetId = 0;

            foreach (var animation in XGCharacter.RawAnimationsData)
            {
                FileInfo f = new FileInfo(Path.Combine(_spritesPath, animation.StartSprite));
                for (int dir = 0; dir < 5; dir++)
                {
                    int skip = animation.SkipBetweenFiles * dir;
                    for (int num = 0; num < animation.Count; num++)
                    {
                        var spritePath = f.DirectoryName + "\\" + (Convert.ToInt32(Path.GetFileNameWithoutExtension(f.Name)) + ((dir * animation.Count) + num + skip)).ToString().PadLeft(4, '0') + ".png";

                        if (File.Exists(spritePath)) // Some sprites missing?
                        {
                            var bytes   = File.ReadAllBytes(spritePath);
                            var image   = Stride.Graphics.Image.Load(bytes);
                            var texture = Texture.New(this.GraphicsDevice, image, TextureFlags.ShaderResource);
                            var sprite  = new Sprite($"{animation.Name}_{dir}_{num}", texture);
                            ss.Sprites.Add(sprite);
                            var animationKey = (animation.Name, (ECameraDirection)dir);
                            if (!this._animations.ContainsKey(animationKey))
                            {
                                this._animations.Add(animationKey, new List <IndividualAnimation>());
                            }
                            _animations[animationKey].Add(new IndividualAnimation()
                            {
                                Name          = animation.Name,
                                Count         = animation.Count,
                                Direction     = (ECameraDirection)dir,
                                Frame         = num,
                                SpriteSheetId = spriteSheetId++
                            });
                            if (dir > 0 && dir < 4) // Get non-north south sprites. Will use for mirror
                            {
                                var bitmap = new Bitmap(spritePath);
                                bitmap.RotateFlip(RotateFlipType.RotateNoneFlipX);
                                bytes   = BitmapToByteArray(bitmap);
                                image   = Stride.Graphics.Image.Load(bytes);
                                texture = Texture.New(this.GraphicsDevice, image, TextureFlags.ShaderResource);
                                sprite  = new Sprite($"{animation.Name}_{dir}_{num}", texture);
                                ss.Sprites.Add(sprite);
                                animationKey = (animation.Name, (ECameraDirection)(8 - dir));
                                if (!this._animations.ContainsKey(animationKey))
                                {
                                    this._animations.Add(animationKey, new List <IndividualAnimation>());
                                }
                                _animations[animationKey].Add(new IndividualAnimation()
                                {
                                    Name          = animation.Name,
                                    Count         = animation.Count,
                                    Direction     = (ECameraDirection)(8 - dir),
                                    Frame         = num,
                                    SpriteSheetId = spriteSheetId++
                                });
                            }
                        }
                    }
                }
            }
            _previousAnimation = _animations[(EActionTypes.Idle, ECameraDirection.North)][0];