nikki
@nikki (Nikki Mei)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

UnityRPGのクエストを作成したいです!

①QuestとEventの違いについて知りたい

一緒.png

GameManagerのPrefabにクエストとイベントが設定されているのですが、
それぞれに紐づく
「QuestManager」と「EventManager」スクリプト
「QuestObjectActivator」と「EventObjectActivator」スクリプト
の内容がほぼ一緒です。(メソッド等の内容は同じで、違うのは変数にquestという名前がついてるかeventなのかというくらい)

クエスト=完了することで次のクエストが発生する
イベント=NPCとの会話やダンジョンに入る等、完了するかどうかは進行に関係なしのイベント
という認識なのですが、なぜほぼ同じスクリプトを使ってまで分けるのでしょうか。

②QuestObjectActivatorのインスペクター上でクエストを作成したい

質問2.png
・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;
            }
        }
    }
}

最後に

初心者のため、質問量が多くなってしまいすみません。
コードを複数回読んだり、写経していても、どこかの知識が不足しているのか、
疑問が一つ湧くたびに他の疑問が倍以上湧いてきてしまい、
いまいち点と点がつながらず、面白いながら、もどかしいです。

「なぜこれがどういう目的で必要なのか」ということを合わせてご教授いただけますと、イメージが湧くので大変嬉しいです。
何卒よろしくお願いいたします!

0

No Answers yet.

Your answer might help someone💌