UnityRPGのクエストを作成したいです!
①QuestとEventの違いについて知りたい
GameManagerのPrefabにクエストとイベントが設定されているのですが、
それぞれに紐づく
「QuestManager」と「EventManager」スクリプト
「QuestObjectActivator」と「EventObjectActivator」スクリプト
の内容がほぼ一緒です。(メソッド等の内容は同じで、違うのは変数にquestという名前がついてるかeventなのかというくらい)
クエスト=完了することで次のクエストが発生する
イベント=NPCとの会話やダンジョンに入る等、完了するかどうかは進行に関係なしのイベント
という認識なのですが、なぜほぼ同じスクリプトを使ってまで分けるのでしょうか。
②QuestObjectActivatorのインスペクター上でクエストを作成したい
・objectToActivate
・questToCheck
・activeIfComplete
のそれぞれの要素を使用して、以下のクエストを作成したいです。
◆NPCと話す→シーンに移動する
どのようにクエストを作成すれば良いでしょうか。
例)GameObjectを作成する、LoadSceneを作る、objectToActivateをチェックする...etc...
・objectToActivateやquestToCheckの用途と目的を合わせてご説明いただけますと、大変嬉しいです!
以下、QuestManagerスクリプトとQuestObjectActivatorスクリプトです。
QuestObjectActivator
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class QuestObjectActivator : MonoBehaviour {
[Tooltip("Drag and drop the game object that should be activated or deactivated")]
public GameObject objectToActivate;
[Tooltip("Choose the quest whose completion should be checked from the Quest Manager")]
public string questToCheck;
[Tooltip("Activate the game object when the chosen quest was completed. Leave unchecked if you want to deactivate the game object instead")]
public bool activeIfComplete;
[Tooltip("Activate a delay before the activation")]
public bool waitBeforeActivate;
[Tooltip("Enter the duration for the delay in seconds")]
public float waitTime;
private bool initialCheckDone;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if(!initialCheckDone)
{
initialCheckDone = true;
CheckCompletion();
}
}
public void CheckCompletion()
{
if(QuestManager.instance.CheckIfComplete(questToCheck))
{
if (waitBeforeActivate)
{
StartCoroutine(waitCo());
}else
{
objectToActivate.SetActive(activeIfComplete);
}
}
}
IEnumerator waitCo()
{
yield return new WaitForSeconds(waitTime);
objectToActivate.SetActive(activeIfComplete);
}
}
QuestManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class QuestManager : MonoBehaviour {
//Make instance of this script to be able reference from other scripts!
public static QuestManager instance;
[Header("Quest Settings")]
public string[] quests;
public bool[] completedQuests;
// Use this for initialization
void Start () {
instance = this;
completedQuests = new bool[quests.Length];
}
// Update is called once per frame
void Update () {
}
//Get the number of a quest
public int GetQuestNumber(string questToFind)
{
for(int i = 0; i < quests.Length; i++)
{
if(quests[i] == questToFind)
{
return i;
}
}
Debug.LogError("Quest " + questToFind + " does not exist");
return 0;
}
//Check if a quest was completed
public bool CheckIfComplete(string questToCheck)
{
if(GetQuestNumber(questToCheck) != 0)
{
return completedQuests[GetQuestNumber(questToCheck)];
}
return false;
}
//Complete quest
public void MarkQuestComplete(string questToMark)
{
completedQuests[GetQuestNumber(questToMark)] = true;
UpdateLocalQuestObjects();
}
//Put a completed quest back to incomplete
public void MarkQuestIncomplete(string questToMark)
{
completedQuests[GetQuestNumber(questToMark)] = false;
UpdateLocalQuestObjects();
}
//Update game objects associated with a quest
public void UpdateLocalQuestObjects()
{
QuestObjectActivator[] questObjects = FindObjectsOfType<QuestObjectActivator>();
if(questObjects.Length > 0)
{
for(int i = 0; i < questObjects.Length; i++)
{
questObjects[i].CheckCompletion();
}
}
}
//Save quest data
public void SaveQuestData()
{
for(int i = 0; i < quests.Length; i++)
{
if(completedQuests[i])
{
PlayerPrefs.SetInt("QuestMarker_" + quests[i], 1);
} else
{
PlayerPrefs.SetInt("QuestMarker_" + quests[i], 0);
}
}
}
//Load quest data
public void LoadQuestData()
{
for(int i = 0; i < quests.Length; i++)
{
int valueToSet = 0;
if(PlayerPrefs.HasKey("QuestMarker_" + quests[i]))
{
valueToSet = PlayerPrefs.GetInt("QuestMarker_" + quests[i]);
}
if(valueToSet == 0)
{
completedQuests[i] = false;
} else
{
completedQuests[i] = true;
}
}
}
}
最後に
初心者のため、質問量が多くなってしまいすみません。
コードを複数回読んだり、写経していても、どこかの知識が不足しているのか、
疑問が一つ湧くたびに他の疑問が倍以上湧いてきてしまい、
いまいち点と点がつながらず、面白いながら、もどかしいです。
「なぜこれがどういう目的で必要なのか」ということを合わせてご教授いただけますと、イメージが湧くので大変嬉しいです。
何卒よろしくお願いいたします!