Кастомный Layout

Программирование на Юнити.

Кастомный Layout

Сообщение AndreyUnger 26 окт 2022, 12:33

Злравствуйте!

Столкнулся с очень странной проблемой. Сделал кастомный рантайм лайоут для раскладки карт "веером" (код ниже под спойлером). Настроил все константы, карты красиво разложились, перехожу к дальнейшим правкам и тут начинает слетать все что я делал. Помогает исправление констант радиусов, расстояния между карт, при этом зачастую чтобы вернуться к прежнему виду приходиться менять с тысячных до целых! При этом откат изменений после которых все слетело - не помогает. Вообще, если создать объект рядом и начать править его - опять все слетает. Такое ощущение что юнити не корретно обновляет рантайм раскладку, и я не вижу актуальных изменений. Уже несколько дней воюю с этой проблемой. Может кто-то что-то подскажет?

Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace UnityEngine.UI.Extensions
{

    [AddComponentMenu("Layout/Extensions/Hand Layout")]
    public class HandLayout : LayoutGroup
    {
        [System.Serializable]
        public enum HandType
        {
            my,
            enemy,
        }
        public HandType type;

        protected override void OnEnable() { base.OnEnable(); CalculateRadial(); }
        public override void SetLayoutHorizontal()
        {
        }

        public override void SetLayoutVertical()
        {
        }
        public override void CalculateLayoutInputVertical()
        {
            CalculateRadial();
        }
        public override void CalculateLayoutInputHorizontal()
        {
            CalculateRadial();
        }
#if UNITY_EDITOR
        protected override void OnValidate()
        {
            base.OnValidate();
            CalculateRadial();
        }
#endif
        void CalculateRadial()
        {
            m_Tracker.Clear();
            if (transform.childCount == 0)
                return;

            var center = new Vector2(0.5f, 1.2f);
            var horRad = 1920 * 0.35f;
            var verRad = (type == HandType.my ? -1 : 1) * 1080 * 0.3f;


            for (int i = 0; i < transform.childCount; i++)
            {
                Card card = transform.GetChild(i).GetComponent<Card>();
                if (card != null)
                {

                    m_Tracker.Add(this, card.GetComponent<RectTransform>(),
                    DrivenTransformProperties.Anchors |
                    DrivenTransformProperties.AnchoredPosition |
                    DrivenTransformProperties.Pivot);

                    var cardSize = card.GetComponent<RectTransform>().sizeDelta;
                    Debug.Log(cardSize);

                    var CardSpread = 0.5f * cardSize.x * 0.5f;
                    int numberOfCards = this.transform.childCount;
                    var angle = Mathf.PI / 2 + CardSpread * (numberOfCards / 2 - i);


                    var OvalAngleVector = new Vector2(horRad * Mathf.Cos(angle), -verRad * Mathf.Sin(angle));
                    var pos = center + OvalAngleVector - cardSize / 2;
                    card.transform.localPosition = new Vector3(pos.x, pos.y, 0);

                }
            }
        }
    }

}
 
AndreyUnger
UNец
 
Сообщения: 1
Зарегистрирован: 26 окт 2022, 12:19

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11