i-school - パズルゲーム 発展14
 一定数の干支をまとめて消したときにボムを生成する機能の作成を行います。

 3回の手順に分けて制作します。



 完成動画です。


<ボムの生成>
動画ファイルへのリンク


<ボム発動>
動画ファイルへのリンク



 ボムの範囲は変数で設定できるようにしています。

 例えば値を変更すれば、すべての干支を破壊するというボムも作れますし、
複数の種類のボムを作り、それぞれの効果範囲を変えるということもできます。


<すべての干支を削除>
動画ファイルへのリンク



<新しく学習する内容>
 ・処理のメソッド化



1.GameManager スクリプトの修正 ー干支の削除処理のメソッド化ー


 ボム機能の制作に向けて、2回の手順に分けて GameManager スクリプトの修正を行います。

 今回の手順では既存の処理をメソッド化し、使いまわせるように準備します。



 下記は、OnEndDrag メソッド内にある、干支を削除している処理です。

  /// <summary>
    /// 干支のドラッグをやめた(指を画面から離した)際の処理
    /// </summary>
	private void OnEndDrag() {

		// つながっている干支が3以上あったら
		if (eraseEtoList.Count >= 3) {
		
	
//// ここから ////
			

			for (int i = 0; i < eraseEtoList.Count; i++) {

				// 干支リストから取り除く
				etoList.Remove(eraseEtoList[i]);
			
				// エフェクト生成
				GameObject effect = Instantiate(eraseEffectPrefab, eraseEtoList[i].gameObject.transform);
				effect.transform.SetParent(etoSetTran);
			
				// 干支を削除
				Destroy(eraseEtoList[i].gameObject);
			
				SoundManager.instance.PlaySE(SoundManager.SE_Type.Erase);
			}
			
			// スコアと消した干支の数の加算
			AddScores(currentEtoType, eraseEtoList.Count);
			
			//// スキルポイント加算
			uiManager.AddSkillPoint(eraseEtoList.Count);
			
			// TODO 4つ以上消えていたら、ボーナス
			
			// 消した干支の数だけ新しい干支をランダムに生成
			StartCoroutine(CreateEtos(eraseEtoList.Count));
			eraseEtoList.Clear();
			
//// ここまで ////
			

		} else {
			for (int i = 0; i < eraseEtoList.Count; i++) {
				// 選んだ数か2個以下の場合 各干支のboolを解除する
				eraseEtoList[i].isSelected = false; 
				ChangeEtoAlpha(eraseEtoList[i], 1.0f);
			}
		}
		firstSelectEto = null;
		lastSelectEto = null;
		currentEtoType = null;
	}

 干支を削除する処理は OnEndDrag メソッド内にあるため、干支を削除するためには、 OnEndDrag メソッドを実行して削除する必要があります。
これが現在の処理です。ドラッグの有無にかかわらず OnEndDrag メソッドを経由しないと、干支が削除できない状態です。

 今回制作するボムの処理は、ボムをタップすることで周囲の干支を削除する、という機能であるため、干支をなぞってつなげる必要がありません
つまり、干支を削除したいのですが、OnEndDrag メソッドそのものではなく、その中にある干支を削除する部分のみを必要としてるため、削除するまでの過程が今までとは異なっています。
 
 ですが、タップ後のボムの処理自体は干支の削除です。
削除の処理自体は、すでに OnEndDrag メソッド内にある機能の一部です。これを利用することができれば、新しく同じ機能を持つ処理を作る必要はありません。
また、同じ処理を何か所にもその都度作成するのは勿体ないです。

 こういったケースにおいては、使いたい処理をブロック単位で取り出し、メソッド化しましょう。
メソッド化しておけば、メソッドの実行命令を1行書くだけで、処理を行ってくれるようになります。
 
 先ほどの干支の削除部分をメソッド化すると、下記のように置き換えることが可能です。

 まずは、既存の部分をコメントアウトしましょう。
その代わりに、メソッドの呼び出し命令を1行書きます。

  /// <summary>
    /// 干支のドラッグをやめた(指を画面から離した)際の処理
    /// </summary>
  private void OnEndDrag() {

	
		// つながっている干支が3以上あったら
		if (eraseEtoList.Count >= 3) {
			
			// 選択されている干支を消す
			EraseEtos();  // ← 新しく作るメソッドの実行命令
			

			// メソッド化する部分をコメントアウト

			// for (int i = 0; i < eraseEtoList.Count; i++) {
			// 	// 干支リストから取り除く
			// 	etoList.Remove(eraseEtoList[i]);
			//
			// 	// エフェクト生成
			// 	GameObject effect = Instantiate(eraseEffectPrefab, eraseEtoList[i].gameObject.transform);
			// 	effect.transform.SetParent(etoSetTran);
			//
			// 	// 干支を削除
			// 	Destroy(eraseEtoList[i].gameObject);
			//
			// 	SoundManager.instance.PlaySE(SoundManager.SE_Type.Erase);
			// }
			//
			// // スコアと消した干支の数の加算
			// AddScores(currentEtoType, eraseEtoList.Count);
			//
			// //// スキルポイント加算
			// uiManager.AddSkillPoint(eraseEtoList.Count);
			//
			// // TODO 4つ以上消えていたら、ボーナス
			//
			// // 消した干支の数だけ新しい干支をランダムに生成
			// StartCoroutine(CreateEtos(eraseEtoList.Count));
			// eraseEtoList.Clear();
			
			// ここまで
			
		} else {
			for (int i = 0; i < eraseEtoList.Count; i++) {
				// 選んだ数か2個以下の場合 各干支のboolを解除する
				eraseEtoList[i].isSelected = false; 
				ChangeEtoAlpha(eraseEtoList[i], 1.0f);
			}
		}
		firstSelectEto = null;
		lastSelectEto = null;
		currentEtoType = null;
	}



 そして、下記の新しい EraseEtos メソッドを定義し、そちらに OnEndDrag メソッド内にあった、干支の削除の処理を移動させます。
メソッドを定義する部分はどこでも構いませんが、OnEndDrag メソッドの下に追加するとつながりが見えやすいでしょう。


	/// <summary>
	/// 選択されている干支を消す
	/// </summary>
	/// <param name="eraseCount"></param>
	private void EraseEtos() {
		
		// 選択されている干支を消す
		for (int i = 0; i < eraseEtoList.Count; i++) {

			// 干支リストから取り除く
			etoList.Remove(eraseEtoList[i]);

			// エフェクト生成
			GameObject effect = Instantiate(eraseEffectPrefab, eraseEtoList[i].gameObject.transform);
			effect.transform.SetParent(etoSetTran);

			// 干支を削除
			Destroy(eraseEtoList[i].gameObject);

			SoundManager.instance.PlaySE(SoundManager.SE_Type.Erase);
		}

		// スコアと消した干支の数の加算
		AddScores(currentEtoType, eraseEtoList.Count);

		//// スキルポイント加算
		uiManager.AddSkillPoint(eraseEtoList.Count);
			
		// TODO 4つ以上消えていたら、ボーナス

		// 消した干支の数だけ新しい干支をランダムに生成
		StartCoroutine(CreateEtos(eraseEtoList.Count));
		eraseEtoList.Clear();
	}

 引数などもありませんので、単純にメソッドを新しく1つ作成し、OnEndDrag メソッドの中身を移動させています。

 このように処理をメソッド化することで、実行命令を書けば、干支の削除の命令をおこなってくれるようになりました。


2.ボムの生成処理のための準備


 次回以降の手順の設計と段取りです。
今後どういったことを予定しているのか、全体像をイメージしておくことが大切です。



 まず、ボムについては、事前にゲームオブジェクトを作成し、Bomb.cs を作成してアタッチした上でプレハブとして用意しておきます。
この準備は次の発展15にて行います。



 ボムの生成については、今回は GameManager に担当させます。こちらは発展16の手順において行います。

 ボムを生成する責務を負うため、プレハブになっているボムのゲームオブジェクトを生成する機能が必要になります。
プレハブを生成するための処理を作るためには、プレハブを登録しておくための変数が必要になります。
これを新しく GameManager に用意します。

 生成位置については、干支と同じ EtoSetTran ゲームオブジェクトの子として生成すれば、干支と同じようにゲーム内に生成されますので、
こちらは新しい変数を用意しなくても既存の変数を流用できます。

 そのほかにも、ボムを生成するために必要なチェーン数、ボムの効果範囲についても新しい変数を用意します。
これらは固定値ではなく、変数として用意しておき、かつ、SerializeField 属性を付与しておくことで、インスペクターから調整が行えるようにします。
 
 特にチェーン数に関しては、ボムを生成する部分にかかわります。
実際にゲームを行ってデバッグをする際に、上手くチェーンがつながらないと、そもそもボムの生成のチェックが出来ません。

 そのため、チェーンに必要な値を変数とし、それをインスペクターから変更することで、デバッグの際には少ないチェーン数でのボムの生成が可能になります。

 このように、デバッグを効率よく行うためにも、ソースコード内にはリテラル表記(固定値・実数)はなるべく用いず、変数として用意し、その値を変更できることが望ましいです。



 以上でこの手順は終了です。

 次は 発展15 です。