public virtual void InitCharacter(int level)
 {
     _animState = ECharacterAnimState.Normal;
     ScaleObject.transform.localScale = Vector3.one;
     UI.gameObject.SetActive(true);
     _powerup.InitPowerup(level);
     Lives.InitCounter(30, 30);  // TODO according to level
     Mana.InitCounter(0, 15);    // TODO according to level
     UpdateReadyMark();
     _destroyed = false;
     _movable   = true;
     _dead      = false;
     DeadObject.SetActive(false);
     SetValueForce(level);
     UnselectForce();
 }
    protected virtual void PlayDeathAnimation()
    {
        _animState = ECharacterAnimState.Death;
        float time = 0.15f;

        LeanTween.cancel(ScaleObject);
        float scaleMin = 0f;

        UI.gameObject.SetActive(false);
        LeanTween.scale(ScaleObject, new Vector3(scaleMin, scaleMin, 1), time)
        .setEaseInOutSine()
        .setOnComplete(() =>
        {
            gameObject.SetActive(false);
        });
        LeanTween.cancel(DeadObject);
        DeadObject.transform.localScale = new Vector3(0, 0, 1);
        DeadObject.SetActive(true);
        LeanTween.scale(DeadObject, Vector3.one, time)
        .setEaseInOutSine();
    }
    protected virtual float PlayGainDamageAnimation()
    {
        _animState = ECharacterAnimState.GainDamage;
        //UpdateLivesView();
        float time = 0.25f;

        LeanTween.cancel(ShakeObject);
        float shakePower = 0.2f;

        LeanTween.value(ShakeObject, 0.0f, 1.0f, time)
        .setOnUpdate((float val) =>
        {
            Vector2 dxy = UnityEngine.Random.insideUnitCircle;
            ShakeObject.transform.localPosition = new Vector3(shakePower * dxy.x, shakePower * dxy.y, 0);
        })
        .setOnComplete(() =>
        {
            ShakeObject.transform.localPosition = Vector3.zero;
            _animState = ECharacterAnimState.Normal;
        });
        return(time);
    }