2013年6月19日水曜日

【Unity】スクリプトから動的にPrefabのインスタンスを生成

プレハブのインスタンスを動的に作る方法を調べた。

方法

using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour {

    public GameObject BlockPrefab;

 void Start () {
            Instantiate(this.BlockPrefab, new Vector3(0, 5, 0), Quaternion.identity);
 }

}

  • Instantiateで動的に生成できる。
  • 引数1:コピー元
  • 引数2:座標
  • 引数3:回転

遊んでみた

using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour
{
    /// <summary>
    /// ブロックプレハブ
    /// </summary>
    public GameObject BlockPrefab;

    /// <summary>
    /// 最下面中心ブロックの底面中心座標
    /// </summary>
    public Vector3 BasePos;

    /// <summary>
    /// 最大ブロック数
    /// 1段3個*18段
    /// </summary>
    private const int MAX_BLOCKS = 3 * 18;

    void Start()
    {
        //ブロック幅(長手方向)
        float w = this.BlockPrefab.transform.localScale.x;
        //ブロック幅(短手方向)
        float d = this.BlockPrefab.transform.localScale.z;
        //ブロック高さ
        float h = this.BlockPrefab.transform.localScale.y;

        for (int i = 0; i < MAX_BLOCKS; i++)
        {
            //何段目か
            int step = Mathf.FloorToInt(i / 3) + 1;
            //奇数段目
            bool isOddStep = step % 2 == 1;
            //短手方向オフセット
            float depthOffset = ((i % 3) - 1) * d;

            float x = isOddStep ? this.BasePos.x : this.BasePos.x + depthOffset;
            float z = !isOddStep ? this.BasePos.z : this.BasePos.z + depthOffset;
            float y = this.BasePos.y + (h / 2.0f) + (step - 1) * h;
            Quaternion quat = isOddStep ? Quaternion.identity : Quaternion.Euler(0, 90, 0);

            Instantiate(this.BlockPrefab, new Vector3(x, y, z), quat);
        }

    }

}
適当にブロックのプレハブ作って実行
実行
ジェンガどーん。
ジェンガっぽい何か

おわり。

Unity系記事まとめ

スポンサーリンク

Related Posts Plugin for WordPress, Blogger...