【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回に分けてます。
続きはこちらからどうぞ。