在网格布局组上动态填充可变数量的精灵

时间:2017-11-17 16:25:11

标签: user-interface unity3d 2d grid-layout

正如标题所暗示的那样,我试图在运行时使用GridLayoutGroup组件在资源文件夹中使用sprite来填充UI面板。问题是精灵不会自动对齐网格单元格,而是被绘制在面板的中心。

我已经尝试了here提到的方法,但它对我不起作用。以下是我使用GridLayoutGroup

附加到gui的脚本
public class SpriteList : MonoBehaviour
{
    public GameObject gridPanel;
    public const string sortingLayer = "Foreground";

    // Use this for initialization
    void Start()
    {
        Sprite[] spriteArray = Resources.LoadAll<Sprite>("Sprites");
        RectTransform gridRT = gridPanel.GetComponent<RectTransform>();

        for (int i = 0; i < spriteArray.Length; i++)
        {
            GameObject cellObject = new GameObject();
            cellObject.AddComponent<SpriteRenderer>();
            cellObject.GetComponent<SpriteRenderer>().sprite = spriteArray[i];
            cellObject.GetComponent<SpriteRenderer>().sortingLayerName = sortingLayer;

            GameObject sprite = (GameObject) Instantiate(cellObject);
            sprite.transform.SetParent(gridPanel.transform, false);
            LayoutRebuilder.ForceRebuildLayoutImmediate( 
                    gridPanel.GetComponent<RectTransform>());
            sprite.transform.localScale = new Vector3(30, 30, 1);
    }
}

更改GridLayoutGroup的设置不会修改我看不到的行为。

因为我在网上看到的所有内容似乎都表明关键是行

sprite.transform.SetParent(gridPanel.transform, false);
我使用的是什么,我缺少什么?

非常感谢!

2 个答案:

答案 0 :(得分:0)

我能够通过创建一个附加SpriteRenderer的rect变换预制件来解决这个问题,然后实例化预制件的副本并在运行时分配所需的精灵。我不确定为什么我的旧方法不起作用(我想我错过了一些非常基本的东西)但这里是我现在使用的代码:

public GameObject gridPanel;
public const string sortingLayer = "Foreground";
public GameObject prefab;

// Use this for initialization
void Start()
{
    Sprite[] spriteArray = Resources.LoadAll<Sprite>("Sprites");
    GameObject newObj;

    for (int i = 0; i < spriteArray.Length; i++)
    {
        newObj = (GameObject)Instantiate(prefab, transform);
        newObj.GetComponent<SpriteRenderer>().sprite = spriteArray[i];
        newObj.GetComponent<SpriteRenderer>().sortingLayerName = sortingLayer;
        LayoutRebuilder.ForceRebuildLayoutImmediate(gridPanel.transform as RectTransform);
    }
}

我应该提一下,这种方法引入/发现了一个新问题,即精灵的尺寸和间距是偏离的。我一直试图解决这个问题一段时间没有成功;当我确定它时,我会继续尝试在此处发布我的解决方案,或者在此处提出单独的问题并发布链接。

答案 1 :(得分:-1)

您的对象应附加“布局元素”组件。

设置对象的父级后,在父级上调用LayoutRebuilder.ForceRebuildLayoutImmediate()