【Unity道場3】ゲームオブジェクトを動的に生成せよ
こんにちは
Unityの書籍を何も考えずに言われるままにゲームを作っても
全く!!!覚えておらず
一向に手放しでゲームを作れるようになれる気がしないため始まった
Unity道場の3回目です。
- 問題1:ゲームオブジェクト動的に生成せよ
回答例
- 解説
- 実行結果
- 問題2:動的生成したゲームオブジェクト削除せよ
回答例
- 解説
- 実行結果
問題1:ゲームオブジェクト動的に生成せよ
ゲームオブジェクト動的に生成するプログラムを書け。
動的生成するプレハブはInspectorビューから指定できるようにすること。
また出現位置をランダム化すること。
回答例
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class PrefabCreater : MonoBehaviour { public GameObject prefab;
void Start() { this.CreatePrefab(); }
void Update() {
}
void CreatePrefab() { float x = Random.Range(-5.0f, 5.0f); float y = Random.Range(0.0f, 5.0f); float z = Random.Range(-5.0f, 5.0f);
GameObject new_prefab = Instantiate(
prefab,
new Vector3(x, y, z),
Quaternion.identity
);
} }
解説
最初のこの部分で、まずUnityのUIから動的に生成したいPrefabを指定してあげます。
public GameObject prefab;こう記述することで、Inspectorビューから事前に生成するプレハブを指定できます。
そして、適当な名前の動的生成用の関数(CreatePrefab)を作ります.
void CreatePrefab() { float x = Random.Range(-5.0f, 5.0f); float y = Random.Range(0.0f, 5.0f); float z = Random.Range(-5.0f, 5.0f);
GameObject new_prefab = Instantiate(
prefab,
new Vector3(x, y, z),
Quaternion.identity
);
}オブジェクトの動的な生成には、Instantiate関数を用います。
この関数は、プレハブからオブジェクトを生成する関数です。
Instantiate関数
-
第1引数:動的生成するプレハブを指定
-
第2引数:出現座標を指定(Vector3構造体)
-
第3引数:回転方向を指定(Quatenion構造体)
問題では、ランダムな座標を指定する必要があるため、float型の数値,x,y,xをRandom.Range関数を用いて生成しています。
Random.Range関数の引数は範囲を示しており、xは-55, yは05, zは-5~5の間で乱数が取得できるようにしてみました。
Instantiate関数の第3引数で指定しているQuaternion.identityは回転しないという意味になります。
実行結果
こんな感じで、再生するたびにランダムに指定した[プラハ](http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%CF)ブがゲームオブジェクトとして出現します。



問題2:動的生成したゲームオブジェクト削除せよ
問題1を拡張すること。
動的に生成したゲームオブジェクトが出現してから3秒後に削除するプログラムを書け。
回答例
using System.Collections;
using System.Collections.Generic; using UnityEngine;
public class PrefabCreater : MonoBehaviour { public GameObject prefab; private GameObject new_prefab;
// Start is called before the first frame update void Start() { this.CreatePrefab(); }
// Update is called once per frame void Update() {
}
void CreatePrefab() { float x = Random.Range(-5.0f, 5.0f); float y = Random.Range(0.0f, 5.0f); float z = Random.Range(-5.0f, 5.0f);
new_prefab = Instantiate(
prefab,
new Vector3(x, y, z),
Quaternion.identity
);
Invoke("DestroyPrefab", 3.0f);
}
void DestroyPrefab() { Destroy(new_prefab); } }
解説
消すためには[グローバル変数](http://d.hatena.ne.jp/keyword/%A5%B0%A5%ED%A1%BC%A5%D0%A5%EB%CA%D1%BF%F4)に動的生成したオブジェクトを置いておく必要があるので、以下を追加
private GameObject new_prefab;消すための関数を適当な名前(DestroyPrefab)で作ります
void DestroyPrefab() { Destroy(new_prefab); } }ゲームオブジェクト削除には、Destory関数を用います。
また、3秒後に消すために、メソッドを遅延実行させる**Invoke関数**を動的生成後に呼び出します。
Invoke("DestroyPrefab", 3.0f);
実行結果
3秒後に消えましたよと。

Unityの教科書 Unity 2020完全対応版 2D&3Dスマートフォンゲーム入門講座




