ステージ生成オブジェクトを作る

次は壁を自動で生成するオブジェクトを作り、ステージを完成させます。

ステージ生成オブジェクトの作成

シーンに空のゲームオブジェクトを作り、名前を「Emitter」に変更してください。そしてScriptsフォルダに新しく「Emitter」スクリプトファイルを作ってWall Emitterにアタッチしてください。

ステージ生成プログラム

Emitterスクリプトファイルを開いて、次のソースコードを記入します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Emitter : MonoBehaviour {

	[SerializeField]
	float emitWaitTimeMin = 0.6f;
	[SerializeField]
	float emitWaitTimeMax = 1.0f;
	[SerializeField]
	float intervalCofficient = 0.98f; //レベルアップしたとき、生成間隔を何倍するかの係数
	[SerializeField]
	float wallSpawnX = 11.0f;
	[SerializeField]
	float wallSpawnY = -2.5f;
	[SerializeField]
	GameObject wall;
	[SerializeField]
	GameManager gameManager;

	bool emitterEnabled = true;
	int cullentLevel;
	float emitWaitTimeMinNow;
	float emitWaitTimeMaxNow;

	//毎フレームの処理
	void Update ()
	{
		//タイトルまたはゲームオーバー画面
		if (!gameManager.playing)
		{
			//初期化
			cullentLevel = gameManager.level;
			emitWaitTimeMinNow = emitWaitTimeMin;
			emitWaitTimeMaxNow = emitWaitTimeMax;
		}

		//プレイ中の処理
		if (emitterEnabled && gameManager.playing)
		{
			//生成処理
			Instantiate(wall, new Vector3(wallSpawnX, wallSpawnY, transform.position.z), Quaternion.identity);

			StartCoroutine(EmitWait());

			//レベルアップ時に生成速度Up
			if (gameManager.level != cullentLevel)
			{
				emitWaitTimeMinNow *= intervalCofficient;
				emitWaitTimeMaxNow *= intervalCofficient;
				cullentLevel = gameManager.level;
			}
		}
	}

	//生成を待つ処理
	IEnumerator EmitWait()
	{
		emitterEnabled = false;
		float emitWaitTime = Random.Range(emitWaitTimeMinNow, emitWaitTimeMaxNow);
		yield return new WaitForSeconds(emitWaitTime);
		emitterEnabled = true;
	}
}

プログラムの解説

毎フレームの処理

タイトルまたはゲームオーバー画面

レベルと生成待ち時間の最大・最小値を初期化します。

プレイ中の処理

壁を1個生成します。生成したら、生成を待つ処理を行います。そして待った後にレベルが変わっていたら、次に生成するときの待ち時間を変数intervalCofficient倍します。

生成を待つ処理

生成を一定時間待ちます。このような処理を行う時はコルーチンとよばれるメソッドを使うと便利です。

問題点の解決:壁の摩擦係数を0にする

これでステージ完成!…と思いきや実はまだ問題点があります。テストプレイしてみると分かるのですが、プレイヤーが壁に乗った時、引っかかって壁と一緒に流れて行ってしまうのです。なぜこんなことになるのかというと、デフォルトで壁に摩擦が設定されているからです。この摩擦を0にしてみましょう。

当たり判定(コライダー)の摩擦は「Physics Material 2D」というもので決まっています。なので新しく摩擦0のマテリアルを作ってアタッチすればOKです。「Physics Material」フォルダを右クリックして、「Create」→「Physics Material 2D」を選択してください。そうしたら名前を「ZeroFrictionMaterial」に変更して、「Friction」の項目を「0」にしてください。あとはWallのプレハブを開き、Box Collider 2Dコンポーネントの「Material」にアタッチしてください。

テストプレイしてプレイヤーキャラが引っかからなければ成功です。これでいよいよゲームらしくなってきました。

次のページ→コイン生成オブジェクトを作る

コメントを残す

メールアドレスが公開されることはありません。