見出し画像

【Unity】【C#】クエストシステムを実装する 第1回

ゲームでよくあるクエストシステムを自分のゲームで実装できたので、その時のやり方を紹介します。

実装イメージはこんな感じです。

・クエスト一覧をスクロールできる

・達成済みクエストがあると「New」バッジが表示される

・達成したクエストは最上位に表示される(報酬受取済みは最下位)

概要

第1回================================

1.スプレッドシートでクエストデータを作成する

2.クエストデータをUnityにインポートする(※外部の記事を参照)

3.Questクラスを作成する

4.QuestManager.csを作成する 

第2回================================

5.List<Quest>にデータを持たせる

6.ScrollView GameObjectを作成する(※今回は割愛)

7.QuestStatusを更新する

8.達成済みQuestがあるか判定する

9.達成済み、未達成、報酬受領済みでソートする

1.スプレッドシートでクエストデータを作成する

こんな感じで作ります。1行目はヘッダーです。

Descript:クエストのタイトル兼内容
SortID:あとでクエストを追加したり並び替えたりするときのためのもの(今回は使用しない)
QuestID:クエストごとの処理をScriptに書く際に必要になるID
RewardType:報酬の種類
RewardValue:報酬の数量

後で解説しますが1行目はstringデータにした方が良いです。

2.クエストデータをUnityにインポートする(※外部の記事を参照)

こちらの記事で紹介されているツールを使って、xlsxファイルをUnityにインポートします。ちなみにExcelを入れて無くてもスプレッドシートからxlsx形式でダウンロードできます。また、Sheet名を「Quest」にしておきます。

ExcelImporterMarkerの設定はこんな感じにします。

するとこんな感じでScriptableObjectとしてデータがインポートされます。1.で1列目をstring型にしておくと、Inspectorの要素名が文字になるため見やすくなります。

※ScriptableObjectって何??って人はこちらの記事を参照ください

3.Questクラスを作成する

2.の手順でEntity_Questクラス(クラス名はインポート時に変更できる)が作成されているのですが、ExcelImporterMarkerはenum型などに対応していないため、Entity_Questクラスを含んだラッパークラスを作成します。

追加するメンバーは、string Nameとenum QuestStateです。

[System.Serializable]
public class Quest
{
	//List<Quest>で要素名を表示するためのもの
	public string Name = "";

	//Entity_Questクラスでは、List<Param> データを格納している
	public Entity_Quest.Param quest = new Entity_Quest.Param ();

	//クエストの状態を管理するためのenum
	public enum QuestState
	{
		Achieved, //達成済み
		NotAchieved, //未達成
		Received //報酬受取済み
	}

        //初期値をNotAchievedに設定する
	public QuestState _QuestState = Quest.QuestState.NotAchieved;
}

この時、enum型の順序が重要です。後でソートするため、ソートしたい順にしておくことで処理が楽になります。

4.QuestManager.csを作成する

次にQuestをListで管理して、ソートやQuestStatusの更新などを行うQuestManagerを作成します。

using System.Collections;
using System.Collections.Generic;
using System.Linq; //忘れないように!

[System.Serializable]
public class QuestManager
{
	//全クエスト
	public List<Quest> Quests = new List<Quest> ();
	public List<Quest> SortedQuests = new List<Quest> ();

	//達成済みクエストの有無を返す
	public bool isAchievedExist ()
	{
		//後で追記する
	}

	//QuestStateでソートしてSortedQuestsにキャッシュする
	public void SortQuests ()
	{
		//後で追記する
	}

	//未達成クエストそれぞれに対して達成してるか判定して、QuestStateを更新する
	public void QuestStateUpdate ()
	{
		var NotAchievedQuests = (from x in Quests
		                         where x._QuestState == Quest.QuestState.NotAchieved
		                         select x).ToList ();

		for (int i = 0; i < NotAchievedQuests.Count; i++) {
			//QuestIDで条件分岐させる
			switch (NotAchievedQuests [i].quest.QuestID) {
			case 100:
				//後で追記する
				break;
			case 101:
				//後で追記する
				break;
			/*以下省略*/
			}
		}
	}
}

長くなってしまったので2回に分けてます。

続きはこちらからどうぞ。


この記事が気に入ったらサポートをしてみませんか?