首页 > 解决方案 > 统一:使父母的大小适合孩子的大小

问题描述

我在有多个对象作为子对象的 Canvas 中有一个空对象。随着游戏的进行,更多的孩子被添加到父母中。我希望父母适合其孩子的大小。

我已经阅读了很多关于这个主题的内容,但是每次我遇到 ContentSizeFitter,不幸的是它对我不起作用,因为它需要一个布局组,而我没有,因为孩子们没有订单并且很疯狂放置。

我正在使用 Unity 2018.3.4f1 个人版。

没有大小的父母:

例子

大小父母(红色:新,绿色:旧):

示例 2

结构:

Canvas
 |- Empty
     |- Child 1
     |- Child 2
     |- Child X

标签: unity3dparent-childscale

解决方案


我已经编写了一小段代码来完成它的工作,或者按照我想要的方式完成它,这对我来说已经足够了:

using UnityEngine;

public class SizeFitter : MonoBehaviour {
    public void CheckForChanges() {
        RectTransform children = transform.GetComponentInChildren<RectTransform>();

        float min_x, max_x, min_y, max_y;
        min_x = max_x = transform.localPosition.x;
        min_y = max_y = transform.localPosition.y;

        foreach (RectTransform child in children) {
            Vector2 scale = child.sizeDelta;
            float temp_min_x, temp_max_x, temp_min_y, temp_max_y;

            temp_min_x = child.localPosition.x - (scale.x / 2);
            temp_max_x = child.localPosition.x + (scale.x / 2);
            temp_min_y = child.localPosition.y - (scale.y / 2);
            temp_max_y = child.localPosition.y + (scale.y / 2);

            if (temp_min_x < min_x)
                min_x = temp_min_x;
            if (temp_max_x > max_x)
                max_x = temp_max_x;

            if (temp_min_y < min_y)
                min_y = temp_min_y;
            if (temp_max_y > max_y)
                max_y = temp_max_y;
        }

        GetComponent<RectTransform>().sizeDelta = new Vector2(max_x - min_x, max_y - min_y);
    }
}

推荐阅读