protected override void Prepare()
        {
            ParallelAnimation parallelani;
            var ball = Factory.Create1by1Sprite();
            float ballSize = 0.5f;
            ball.transform.localScale = new UnityEngine.Vector3(ballSize,ballSize,ballSize);
            TextureAnimation texani;
            SizeChangeAnimation sizeani;
            MoveTransformAnimation moveani;
            var height = 1f;
            var terrain = (TerrainEntity)Spell.Targets[0][0];
            var heropos = Spell.Controller.Hero.PositionAs<TilePosition>().Point;
            var fromPos = Factory.ConvertPos(heropos, height);
            var toPos = Factory.ConvertPos(terrain.PositionAs<TilePosition>().Point, 0.8f);

            parallelani = new ParallelAnimation();
            texani = new TextureAnimation(this.Factory.LoadSpellTexture("fireball"), 8, 8);
            texani.Frames = new int[]{6};
            texani.FrameRepeats = Enumerable.Repeat<int>(1, 2).ToArray();
            texani.AutoLooping = true;
            parallelani.Add(texani, false);

            moveani = new MoveTransformAnimation(fromPos,toPos,12f);
            parallelani.Add(moveani,  true);
            this.EnqueueAnimation(ball, parallelani);

            parallelani.Completed += (sender, evt) =>
                {
                    var explosion = Factory.Create1by1Sprite();
                    explosion.transform.position = toPos;
                    parallelani = new ParallelAnimation();
                    texani = new TextureAnimation(this.Factory.LoadSpellTexture("fireball"), 8, 8);
                    texani.Frames = Enumerable.Range(1, 38).ToArray();
                    texani.FrameRepeats = Enumerable.Repeat<int>(1, 38).ToArray();
                    parallelani.Add(texani, true);

                    sizeani = new SizeChangeAnimation(0.02f);
                    parallelani.Add(sizeani, false);
                    this.EnqueueAnimation(explosion, parallelani);
                };
        }
    private void OnUnitBeginMove(BeginMoveEvent evt)
    {
        var currentPos = evt.From;
        var endPos = evt.To;

        var worldCurPos = Factory.ConvertUnitPos(currentPos);
        var worldEndPos = Factory.ConvertUnitPos(endPos);

        var speed = Factory.ConvertDurationToSpeed(entity.Module<MoveModule>().MoveDuration);

        var moveani = new MoveTransformAnimation(worldCurPos, worldEndPos, speed);
        moveani.Reset();
        moveani.Begining += (_, _1) =>
            {
                this.direction = (new Vector(currentPos, endPos)).Direction;
            };
        this.awaitingAnimations.Enqueue(moveani);
    }