Задать вопрос
@Gioo12x

Как заставить кнопки в ScrollView корректно перераспределять остальные элементы при анимации?

У меня возникла такая проблема в коде: анимация сворачивания и раскрытия дочерних кнопок проигрывается, но они должны сдвигать не дочерние кнопки, которые находятся в ScrollView. Есть ли способы это исправить?

Внешний вид структуры
abeab1f7a6d1b17061bbc6cdc65f0668.png

Сам код:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using DG.Tweening;

public class TreeButton : MonoBehaviour, IPointerClickHandler
{
    [Header("UI")]
    [SerializeField] private RectTransform buttonChild;

    [Header("Anim")]
    [SerializeField] private float duration = 0.25f;

    private bool isOpen = true;

    private void Start()
    {
        isOpen = true;
        buttonChild.gameObject.SetActive(true);
    }

    //  обработка кликов мыши
    public void OnPointerClick(PointerEventData eventData)
    {
        //  ТОЛЬКО ПРАВАЯ КНОПКА
        if (eventData.button == PointerEventData.InputButton.Right)
        {
            Toggle();
        }
    }

    public void Toggle()
    {
        if (isOpen)
            Close();
        else
            Open();

        isOpen = !isOpen;
    }

    private void Open()
    {
        buttonChild.gameObject.SetActive(true);

        buttonChild.localScale = new Vector3(1, 0, 1);

        buttonChild
            .DOScaleY(1f, duration)
            .SetEase(Ease.OutCubic)
            .OnUpdate(UpdateLayout)
            .OnComplete(UpdateLayout);
    }

    private void Close()
    {
        buttonChild
            .DOScaleY(0f, duration)
            .SetEase(Ease.InCubic)
            .OnUpdate(UpdateLayout)
            .OnComplete(() =>
            {
                buttonChild.gameObject.SetActive(false);
                UpdateLayout();
            });
    }

    private void UpdateLayout()
    {
        LayoutRebuilder.ForceRebuildLayoutImmediate(
            (RectTransform)transform.parent
        );
    }
}
  • Вопрос задан
  • 24 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Stepik
    PRO C#. Профессия "Backend разработчик"
    4 месяца
    Далее
  • Яндекс Практикум
    Продвинутая разработка на C# и .NET
    5 месяцев
    Далее
  • Merion Academy
    C# разработчик с нуля
    4 месяца
    Далее
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
DOScaleY меняет только визуальный масштаб, лейаут-группа его полностью игнорирует. Добавь на buttonChild LayoutElement и твинь preferredHeight вместо скейла —
DOTween.To(() => le.preferredHeight, x => le.preferredHeight = x, 0f, duration)
. Тогда и ребилд нормально пересчитает позиции.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы