

unityを使ってます。  
`instantiate`でオブジェクトを生成したのですが、  
canvas内に入っていないとuguiのボタンが使えないため、canvas内に生成しなければなりません。

したがって、canvas内に生成するために階層をcanvas内として指定して生成するには  
どういった書き方をすればいいでしょうか。

現時点ではこのように書いています

[code]

    int enemyIndex = Random.Range(0, enemy.Length);
    Instantiate(enemy[enemyIndex],  new Vector3(0, 3, 0), transform.rotation);
    
[/code]


CC BY-SA 3.0
2015-10-10T01:48:40.987
17488
2015-10-10T06:52:57.293
2015-10-10T06:48:27.453
12383
9268
question
c# unity3d
オブジェクトの生成　階層


直接Canvas内にオブジェクトを生成するのは難しいですが、  
`Instantiate()`で作成したオブジェクトのtransformを`SetParent()`を用いてCanvas内の階層に入れてあげることはできます。  
<http://docs.unity3d.com/jp/current/ScriptReference/Transform.SetParent.html>

ただしCanvasのtransformを取得する必要があります。  
取得する方法は以下の方法などいくつか存在します。  
現在のプロジェクトで一番やりやすいやり方で取得してみてください。

1.Canvasのメンバ変数をシリアライズして、エディター上でCanvasを設定する。

[code]

    public class EnemyManager : MonoBehaviour
    {
        [SerializeField]
        private Canvas  m_canvas    = null;
    
    } // class EnemyManager
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/clmFC.png)](https://i.stack.imgur.com/clmFC.png)

2.Hierarchy全体からCanvasを検索し取得する  
(Canvasが複数ある場合は特定のCanvasを取得するのは難しいです)

[code]

    var canvas  = GameObject.FindObjectOfType< Canvas >();
    
[/code]

3.Canvasに特定のTagを埋め込み、そのTagから検索し取得する。

[![画像の説明をここに入力](https://i.stack.imgur.com/bOibA.png)](https://i.stack.imgur.com/bOibA.png)

[code]

    var canvas  = GameObject.FindGameObjectWithTag( "CanvasTag" );
    
[/code]

Canvas取得後、以下の方法で`SetParent()`を用いれば、Canvas内に生成したオブジェクトが配置されます。  
以下のコードは「2.Hierarchy全体からCanvasを検索し取得する」を使ってCanvasを取得しています。

[code]

    using UnityEngine;
    using UnityEngine.UI;
    
    public class EnemyManager : MonoBehaviour
    {
        [SerializeField]
        private Button[]    m_enemyList = null;
    
        void Start()
        {
            CreateEnemy();
        }
    
        private void CreateEnemy()
        {
            int enemyIndex  = Random.Range( 0, m_enemyList.Length );
            var enemyObject = Instantiate( m_enemyList[ enemyIndex ], new Vector3( 0, 3, 0 ), transform.rotation ) as Button;
    
            var canvas      = GameObject.FindObjectOfType< Canvas >();
            enemyObject.transform.SetParent( canvas.transform, false );
        }
    
    } // class EnemyManager
    
[/code]

参考にしてみてください。


CC BY-SA 3.0
2015-10-10T06:52:57.293
17502
2015-10-10T06:52:57.293
12383
17488
answer