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

User interface 在网格布局组中动态填充可变数量的精灵,user-interface,unity3d,2d,grid-layout,User Interface,Unity3d,2d,Grid Layout,正如标题所示,我试图在运行时使用资源文件夹中的精灵,用GridLayoutGroup组件填充UI面板。问题是精灵不会自动与网格单元对齐,而是在面板的中心绘制 我尝试过上面提到的方法,但它对我不起作用。以下是我随GridLayoutGroup附加到gui的脚本: 公共阶层精神主义者:单一行为 { 公共游戏对象网格面板; public const string sortingLayer=前景; //用于初始化 无效启动 { Sprite[]spriteArray=Resources.LoadAllS

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

我尝试过上面提到的方法,但它对我不起作用。以下是我随GridLayoutGroup附加到gui的脚本:

公共阶层精神主义者:单一行为 { 公共游戏对象网格面板; public const string sortingLayer=前景; //用于初始化 无效启动 { Sprite[]spriteArray=Resources.LoadAllSprites; RectTransform gridRT=gridPanel.GetComponent; 对于int i=0;i 因为我在网上看到的一切似乎都表明关键是线路

sprite.transform.SetParentgridPanel.transform,false; 我用的是什么,我错过了什么


非常感谢!

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


设置对象的父对象后,在父对象上调用LayoutRebuilder.ForceRebuildLayoutImmediate。

我能够解决这个问题,方法是创建一个连接了SpriteRender的rect transform预制,然后实例化该预制的副本,并在运行时分配所需的sprite。我不确定我以前的方法为什么不起作用我遗漏了一些非常基本的东西,但下面是我现在使用的代码:

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);
    }
}

我应该提到的是,这种方法引入/发现了一个新问题,即精灵的大小和间距太远。我已经尝试解决这个问题一段时间了,但没有成功;我将继续尝试,在确定解决方案后在此处发布解决方案,或者问一个单独的问题,并在此处发布指向该解决方案的链接。

我也更新了我的帖子,加入了新的代码。你知道为什么吗?谢谢!