//отрисовывает группу юнитов
    void _drawGroup(RealBattleScript.BattleGroup group,
                    RealBattleScript.RealBattleTroops troop, SkeletonAnimation[] arr)
    {
        for (int i = 0; i < group.GetUnitsCount(); i++)
        {
            //считает нужную пощицию на поле и размер юнита
            //повыше - поменьше, пониже - побольше
            #region SCALE_AND_POSITION
            float half_side = RealBattleInfoScript.GetUnitSide(troop) / 2.0f;
            float left      = group.GetUnit(i).X - half_side - RealBattleInfoScript.FieldLeft;
            float top       = group.GetUnit(i).Y - half_side - RealBattleInfoScript.FieldTop;
            arr[i].transform.position = new Vector3(left, top, 0);
            float scalePer = 1.0f - ((group.GetUnit(i).Y - RealBattleInfoScript.FieldLeft) /
                                     (RealBattleInfoScript.FieldWidth - RealBattleInfoScript.FieldLeft));
            scalePer *= scalePer;
            float scaleFactor = troop == RealBattleScript.RealBattleTroops.Inf ||
                                troop == RealBattleScript.RealBattleTroops.Art ? 5.0f : 3.2f;
            float xScale = scaleFactor * scalePer * (group.IsOne ? 1 : -1);
            float yScale = scaleFactor * scalePer;
            arr[i].transform.localScale = new Vector3(xScale, yScale, 1.0f);
            #endregion

            //выставляет анимацию по информации из логики битвы
            #region ANIM
            RealBattleScript.BattleUnit unit = group.GetUnit(i);
            switch (unit.State)
            {
            case RealBattleScript.UnitStates.Stay:
                SetAnim(arr[i], AnimState.IDLE);
                break;

            case RealBattleScript.UnitStates.MoveOne:
            case RealBattleScript.UnitStates.MoveAll:
                SetAnim(arr[i], AnimState.WALK);
                break;

            case RealBattleScript.UnitStates.Fight:
                if (troop != RealBattleScript.RealBattleTroops.Art)
                {
                    SetAnim(arr[i], AnimState.ATTACK);
                }
                else if (unit.ArtShoot)
                {
                    SetAnim(arr[i], AnimState.BOW_SHOOT, false);
                    arr[i].state.Complete += delegate(Spine.TrackEntry entry)
                    { unit.ArtShoot = false; };
                }
                else
                {
                    SetAnim(arr[i], AnimState.IDLE, true);
                }
                break;
            }
            #endregion
        }
    }
 //выставляет анимацию смерти и прозрачность 0.2 для умерших юнитов
 void _DestroyDead(RealBattleScript.BattleGroup group, SkeletonAnimation[] arr)
 {
     for (int i = group.GetUnitsCount(); i < arr.Length; i++)
     {
         if (arr[i] != null)
         {
             SetAnim(arr[i], AnimState.DEATH, false);
             arr[i].skeleton.SetColor(new Color(0.0f, 0.0f, 0.0f, 0.2f));
             arr[i] = null;
         }
         else
         {
             break;
         }
     }
 }