2017-11-17 7 views
0

タイトルが示唆するように、実行時にGridLayoutGroupコンポーネントの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); 

であることを示していると思われるので

、私が何をしないのですか?

多くの感謝!

答えて

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

:私は私の古いアプローチが機能しなかった理由はわからないんだけど(私は非常に基本的な何かが足りないと思う)が、ここで私が今使っているコードです。スプライトのサイジングと間隔が離れているという新しい問題です。私はしばらくの間これを修正しようとしていますが、今は成功していません。私はそれを決定するときに私の解決策をここに掲載しようとし続けます。そうでなければ、別の質問をして、ここにそのリンクを投稿してください。

関連する問題