正如标题所暗示的那样,我试图在运行时使用GridLayoutGroup
组件在资源文件夹中使用sprite来填充UI面板。问题是精灵不会自动对齐网格单元格,而是被绘制在面板的中心。
我已经尝试了here提到的方法,但它对我不起作用。以下是我使用GridLayoutGroup
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);
我使用的是什么,我缺少什么?
非常感谢!
答案 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()
。