Пример #1
0
    public bool Flip(bool toLeft = true, float speedMultiplier = 1)
    {
        int desiredIndex = (toLeft? index + 1 : index - 1);

        if (0 > desiredIndex || desiredIndex >= presets.Count)
        {
            return(false);
        }

        Poser  currentPoser  = CurrentPoser();
        Preset currentPreset = CurrentPreset();

        if (currentPreset.Pose != null)
        {
            currentPoser.StopMotion();
            currentPoser.ApplyPose(currentPreset.Pose, FLIP_DURATION / speedMultiplier / 2);
        }

        index = desiredIndex;

        int tweenSlotBeginIndex = 0;
        int tweenSlotEndIndex   = 0;
        int lastSlotIndex       = SlotsNum - 1;

        if (toLeft)
        {
            tweenSlotBeginIndex = 1;
            tweenSlotEndIndex   = lastSlotIndex;
        }
        else
        {
            tweenSlotBeginIndex = 0;
            tweenSlotEndIndex   = lastSlotIndex - 1;
        }

        for (int i = tweenSlotBeginIndex; i <= tweenSlotEndIndex; i++)
        {
            int     newIndex    = i + (toLeft? -1 : +1);
            Vector3 newPosition = GetSlotPosition(newIndex);
            LTDescr tween       = LeanTween.moveLocal(slots[i].gameObject, newPosition, FLIP_DURATION / speedMultiplier).setEase(LeanTweenType.easeInOutCubic);
            if (i == CenterSlot)
            {
                tween.setOnComplete(OnCenterSlotFlipComplete);
            }
        }

        int   poppingSlotIndex = (toLeft? 0 : lastSlotIndex);
        Poser reusedSlot       = slots[poppingSlotIndex];

        slots.RemoveAt(poppingSlotIndex);

        int halfSlotsNum        = SlotsNum / 2;
        int endPointPresetIndex = index + (toLeft? halfSlotsNum : -halfSlotsNum);

        reusedSlot.ApplyPreset(presets.Get(endPointPresetIndex));

        int pushingSlotIndex = (toLeft? lastSlotIndex : 0);

        slots.Insert(pushingSlotIndex, reusedSlot);

        reusedSlot.transform.localPosition = GetSlotPosition(pushingSlotIndex);

        return(true);
    }