1834

[code]

    public Text[] text;
    
    for(int i = 0; i < 10; i++){
       text[i].transform.position = new Vector3(X, Y, Z);
       Instantiate(text);   
    }
    
[/code]

と言った形でUnityのTextを複製しようと考えましたが、座標は確かに10個存在するものの、Textが表示されませんでした。
Unity4.6から搭載されたUIをスクリプトから生成するにはどのようにすればよろしいでしょうか？


CC BY-SA 3.0
2014-12-16T10:31:30.517
1738
2014-12-18T09:47:03.837
2014-12-16T12:18:45.007
30
2487
question
unity3d c# ugui
Unity4.6でUIのTextを複製する方法


uGUI の UI 要素は、Canvas の子要素でないと描画されません。  
Hierarchy 上に Canvas 要素がなければ追加しましょう。

その上で、Text 要素を Canvas (またはその子要素) の子要素にする必要があります。  
以下のコードを追加してみてください。

[code]

    text[i].transform.SetParent(UnityEngine.Object.FindObjectOfType<Canvas>().transform);
    
[/code]


CC BY-SA 3.0
2014-12-16T12:59:36.127
1765
2014-12-16T12:59:36.127
3929
1738
answer


Textを複製する場合も結局は GameObject単位で管理することになるので、GameObjectをInstantiateするコードを書いてみました。

あと、先のコードからは、10個のTextを複製（合計20個）したいのか、1個のTextを10個複製（合計11個）したいのか分からなかったので、両方とも用意してみました。
※いずれも元となるTextはCanvasの下に既に配置済みであるという前提です。

10個のTextを複製する場合：

[code]

    public GameObject[] text;  // インスペクタなどで事前に設定
    
    void Start () {
        for(int i = 0; i < 10; i++){
            var o = Instantiate(text[i]) as GameObject;
            o.transform.localPosition = new Vector3(X,Y,Z);
            o.transform.parent = text[i].transform.parent;  // 元のTextと同じ親にする
        }
    }
    
[/code]

1個のTextを10個複製する場合：

[code]

    public GameObject originalText;  // インスペクタなどで事前に設定
    GameObject[] text;
    
    void Start () {
        text = new GameObject[10];
        for(int i = 0; i < 10; i++){
            text[i] = Instantiate(originalText) as GameObject;
            text[i].transform.localPosition = new Vector3(X,Y,Z);
            text[i].transform.parent = originalText.transform.parent;  // 元のTextと同じ親にする
        }
    }
    
[/code]


CC BY-SA 3.0
2014-12-17T02:13:28.303
1834
2014-12-17T02:13:28.303
2079
1738
answer


複製されたTextのtransform.positionについては

[code]

    transform.SetParent(ParentObject.transform, false)
    
[/code]

することで、想定どおりの動作になるかもしれません。 下記のコードをScene内のオブジェクトに追加して動作させてみてください。

[code]

    using UnityEngine;
    using System.Collections;
    
    public class TextCreator : MonoBehaviour
    {
        //PanelやCanvas等、Textを配置するための親GameObjectをInspectorで設定しておく
        public GameObject ParentObject;
    
        //TextをPrefab化してInspectorで設定しておく
        public GameObject TextPrefab;
    
        // Use this for initialization
        IEnumerator Start()
        {
            var textPosition = new Vector3(10, 10);
    
            for (int i = 0; i < 10; i++)
            {
                //TextのPrefabをInstantiate
                var obj = Instantiate(TextPrefab);
    
                //複製されるTextの位置を上へずらす
                obj.transform.position = textPosition + new Vector3(0, textPosition.y * i);
    
                //worldPositionStays=falseにすることで、TextがParentObjectによって相対的に配置される
                obj.transform.SetParent(ParentObject.transform, false);
    
                //1秒ごとに配置
                yield return new WaitForSeconds(1f);
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2014-12-18T09:47:03.837
2022
2014-12-18T09:47:03.837
4077
1738
answer