はりうすブログ (のすけのメモ)

湘南にある小さな会社 代表 ”のすけ”のブログです

【Unity道場3】ゲームオブジェクトを動的に生成せよ

こんにちは

Unityの書籍を何も考えずに言われるままにゲームを作っても

全く!!!覚えておらず


一向に手放しでゲームを作れるようになれる気がしないため始まった

Unity道場の3回目です。

問題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は-5~5, yは0~5, zは-5~5の間で乱数が取得できるようにしてみました。

Instantiate関数の第3引数で指定しているQuaternion.identityは回転しないという意味になります。

実行結果

こんな感じで、再生するたびにランダムに指定したプラハブがゲームオブジェクトとして出現します。

f:id:hollywis:20210215144338p:plain

f:id:hollywis:20210215144331p:plain
f:id:hollywis:20210215144326p:plain

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

解説

消すためにはグローバル変数に動的生成したオブジェクトを置いておく必要があるので、以下を追加

private GameObject new_prefab;

消すための関数を適当な名前(DestroyPrefab)で作ります

void DestroyPrefab()
  {
    Destroy(new_prefab);
  }
}

ゲームオブジェクト削除には、Destory関数を用います。

また、3秒後に消すために、メソッドを遅延実行させるInvoke関数を動的生成後に呼び出します。

Invoke("DestroyPrefab", 3.0f);

実行結果

3秒後に消えましたよと。

f:id:hollywis:20210215151306p:plain

Unity2020入門

Unity2020入門