Developer

【Unity】5分で考えたゲームを作る~ブロック積み②~
2021.07.29
Lv1

【Unity】5分で考えたゲームを作る~ブロック積み②~

5分で考えたゲームを作る~ブロック積み②~

こんな感じのシンプルなゲームを作ってみるの第2回です。
今回はスクリプトを作成して、ゲームオブジェクトに動きをつけていきます。
ブロックの自動生成~積み上げ(1つ目まで)を作成しましょう。

前回の記事はこちら↓
5分で考えたゲームを作る~ブロック積み①~


■Cubeのスクリプト作成

Cubeに適用するスクリプトを作成します。
このスクリプトで行わせたいことは主に、「Cubeの移動」と「クリックしたタイミングで落下」です。

Projectビューにて、右クリック → Create → C# Script を選択します。名前は「CubeController」としましょう。
作成したら以下の内容を記述します。(コメントは解説のために付けているだけなので、書かなくてもOK)

using UnityEngine;

public class CubeController : MonoBehaviour {

	Rigidbody rb;

	void Start() {
		// Rigidbodyコンポーネントの取得
		rb = GetComponent<Rigidbody>();
		// 静止判定の閾値を変更
		rb.sleepThreshold = 1f;
	}

	void Update() {

		// 重力が無効な場合
		if (!rb.useGravity) {

			// マウスの左クリックで
			if (Input.GetMouseButtonDown(0)) {
				// 重力を有効化
				rb.useGravity = true;
			} else {
				// 右に移動
				transform.Translate(10f * Time.deltaTime, 0, 0);
			}
		}
	}
}

・積み上げたCubeが止まったと判定されやすくなるように、Rigidbodyの静止判定の閾値をかなり大きくしています。(デフォルトは0.005)
作成したスクリプトはCube(プレハブ)にアタッチしておきましょう。

■Cubeが生成されるポイントを準備

Cubeが次々と生成される個所の準備をします。
Cubeを次々と生成する処理自体はスクリプトから行いますが、生成座標の指定をすべてスクリプトから行うと後から変更するときに手間が増えます。
自動生成を使う際は、予め目印となるオブジェクトを配置しておく手法がおすすめです。後から生成位置を変えるのもスクリプトを弄る必要がないため簡単です。

Hierarchyビューにて、右クリック → Create Empty を選択し、空のオブジェクトを作成します。名前は「Spawn」としましょう。
座標は以下の様に設定してください。

(もしCubeが生成される座標を変更したければ、このSpawnオブジェクトを動かします。)

■Cubeの自動生成およびゲーム全体を管理するスクリプトを作成

Projectビューにて、右クリック → Create → C# Script を選択し、名前は「GameController」とします。
作成したら以下を記述してみましょう。ひとまず今回はゲーム開始の処理と、1つ目のCubeの生成~積み上げて停止するまでの処理を実装します。(コメントは解説のために付けているだけなので、書かなくてもOK)

using UnityEngine;

public class GameController1 : MonoBehaviour {

	public GameObject prefab;
	public Material material;

	private GameObject cube;
	private bool isStart;

	void Start() {
		isStart = false;
	}

	void Update() {

		// 未スタート時、左クリックで開始
		if (!isStart && Input.GetMouseButtonDown(0)) {
			isStart = true;
			// Cubeを生成
			cube = Instantiate(prefab, transform.position, Quaternion.identity);
		}

		// スタートするまではUpdate内の次の処理に進ませない
		if (!isStart) {
			return;
		}

		// Cubeが静止したら
		if (cube.GetComponent<Rigidbody>().IsSleeping()) {
			// 色を変える
			cube.GetComponent<Renderer>().material = material;
		}
	}
}

・Instantiate は、ゲームオブジェクトをシーンに生成するための重要なメソッドです。
今回のInstantiateの処理を解釈すると、「prefabを、transform.positionの位置に、Quaternion.identityの角度で生成」となります。
生成されたオブジェクトを変数Cubeで受け取っておき、次の処理に活用しています。かなり役に立つ記述方法なので知らなければ参考にしてみてください。

記述が済んだら、先ほど作成したSpawnオブジェクトにアタッチしましょう。
public変数のprefabとmaterialには、Unityエディタ上で手作業で紐づけを行います。
以下の図を参考に、PrefabにはPrefabビューにあるCube(プレハブ)をアタッチ、MaterialにはGreen(マテリアル)をアタッチしておきましょう。

■動作確認

ここまで作り終えたら動作確認をしてみましょう。シーンを再生したら以下の項目を確認してみてください。
・シーンが再生できるか?(スクリプトにエラーがあるとシーンが再生できません)
・左クリックでCubeが画面左から流れてくるか?
・Cubeが流れているときに、左クリックしたタイミングでCubeが落下するか?
・支柱の上にCubeを積み重ねたときにCubeの色が変わるか?

全て問題なく動作したら、次回に進みましょう!
上手く動かない箇所があったら、これまでの内容に漏れがないか確認してみましょう。

5分で考えたゲームを作る~ブロック積み③~ に続く

Unity実践編 - 目次リンク

実践Unityゲームプログラミング 連載目次