UNITY的UI层级缩放功能会这么令人沮丧。

我最近一直在开发一款卡片UI,快速意识到标准的HorizontalLayoutGroup并不能实现扇形/圆形形式。因此,我使用Mathf.Cos和Mathf.Sin迅速写了一份脚本来把牌沿着一个圆分布。直到我重新调整了游戏窗口大小时,整个半径因为Canvas Scaler而完全破裂。

经过太多尝试与错误后,我意识到技巧是使用 local space中的三角函数, 然后让transform.TransformPoint()来完成把它转换为World Space的关键步骤。这强制使用的坐标完美地尊严了UI层级缩放, 无论是在4K显示器上还是在移动设备上。

如果你也在经历着相同的头痛,这个核心逻辑可以让你获得一些帮助:

float angleStep = totalArcAngle / (cardCount > 1 ? cardCount - 1 : 1);
float currentAngle = -totalArcAngle / 2;

for (int i = 0; i < cardCount; i++)
{
    // 1. 两维平面上的三角函数
    float radians = (currentAngle + 90) * Mathf.Deg2Rad;
    Vector3 localPos = new Vector3(
        Mathf.Cos(radians) * arcRadius, 
        Mathf.Sin(radians) * arcRadius, 
        0
    ) + pivotOffset;

    // 2.修复: 在World Space中尊严UI层级缩放
    Vector3 worldPos = transform.TransformPoint(localPos);

    card.position = worldPos;
    card.rotation = transform.rotation * Quaternion.Euler(0, 0, currentAngle);

    currentAngle += angleStep;
}

希望这能为某些人节省几个小时的界面数学调试!