2017-11-17 1 views
0

제목에서 알 수 있듯이 런타임에 GridLayoutGroup 구성 요소가있는 UI 패널을 자원 폴더의 스프라이트로 채우려고합니다. 문제는 스프라이트가 격자 셀에 자동으로 정렬되지 않고 대신 패널의 중앙에 그려지는 점입니다.격자 레이아웃 그룹에 가변적 인 수의 스프라이트를 동적으로 채 웁니다.

나는 접근 방법을 시도한 here을 시도했지만 그것은 나를 위해 작동하지 않습니다.

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의 설정을 변경 : 여기가 GridLayoutGroup으로 GUI를 부착 한 스크립트입니다. 나는 온라인으로 볼 수있는 모든 키가 선 내가 사용

sprite.transform.SetParent(gridPanel.transform, false); 

임을 나타내는 것 때문에

, 내가 뭘 놓친 거지?

감사!

답변

-1

개체에 '레이아웃 요소'구성 요소가 연결되어 있어야합니다.

개체의 부모를 설정하면 부모에 LayoutRebuilder.ForceRebuildLayoutImmediate()이 호출됩니다.

+0

나는 이것을 시도했지만 작동하지 않았다. (나는 새 코드를 포함하도록 내 게시물을 업데이트했다.) 왜이게 될지 아십니까? 감사! – Rookatu

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

나는이 방식이 도입 된 것을 언급해야한다 : 나의 오래된 방법은 작동하지 않았다 내가 왜하지만 여기에 내가 지금 사용하고 코드입니다 (내가 아주 기본적인 뭔가를 놓친 거지 생각) 확실하지 않다 스프라이트의 크기와 간격이 길다는 새로운 문제. 나는 잠시 동안 이것을 고치려고 노력했지만 성공하지 못했다. 나는 그것을 결정할 때 여기에서 나의 해결책을 게시하고 게시 할 것이다. 그렇지 않으면 별도의 질문을하고 여기에 대한 링크를 게시해라.

관련 문제