ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

Unityで2DのRPGを作る - クエスト達成後に報酬をもらえる機能を追加(猫の冒険)

Unity で 2DRPG 作りに奮闘してます。
今回は、クエスト機能を追加したら、達成後に報酬をもらえるようにしたくなったので、クエスト達成後に報酬をもらえる機能を追加してみました。

やりたいこと

  • クエストに報酬を設定できるようにする。
  • クエスト達成後に報酬を表示する。
  • クエスト達成の会話の終了後に報酬ウィンドウを表示する。
  • 報酬があるクエストだけ報酬ウィンドウを表示する。
  • 各クエストの報酬は一度きりの受け取りにする。

実装したこと

報酬表示ウィンドウを設定
  • 報酬タイトル追加
  • 報酬(経験値)表示用ラベルとテキスト追加
  • 報酬(アイテム)表示用ラベルとテキスト追加
  • 報酬(お金)表示用ラベルとテキスト追加
  • 閉じるボタン追加

f:id:a1026302:20201110024436p:plain

クエスト報酬スクリプト作成
  • 報酬の有無フラグを作成
  • クエストナンバ指定変数作成(どのクエストの報酬か判断用)
  • 各報酬の変数作成
  • クエスト報酬ウィンドウを開く関数作成
  • クエスト報酬ウィンドウを開く関数に各報酬を渡す処理を追加
  • クエスト報酬ウィンドウを閉じる関数作成

f:id:a1026302:20201110030516p:plain

ウィンドウ表示用スクリプト
  • 報酬の有無フラグを追加
  • 報酬取得済みフラグを追加
  • 各報酬の変数追加
  • 報酬の有無フラグが有の場合のみクエスト報酬ウィンドウが開く処理を追加
  • 指定した報酬取得済みフラグが無の場合のみクエスト報酬ウィンドウが開く処理を追加
  • 報酬受け取り後に報酬取得フラグを有にする処理を追加
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class QuestRewards : MonoBehaviour
{
    public static QuestRewards instance;

    public Text xpText, itemText, goldText;
    public GameObject rewardScreen;

    public string[] rewardItems;
    public int xpEarned;

    public bool markQuestComplete;
    public string questToMark;

    public void OpenRewardScreen(
        int xp, 
        string[] rewards,
        int questRewardGold
    )
    {
        xpEarned = xp;
        rewardItems = rewards;
        xpText.text = "全員が " + xpEarned + " の経験値を獲得しました!";
        itemText.text = "";
        goldText.text = questRewardGold + "g";

        for(int i = 0; i < rewardItems.Length; i++)
        {
            itemText.text += rewards[i] + "\n";
        }
        rewardScreen.SetActive(true);
    }
    
    public void CloseRewardScreen()
    {
        for(int i = 0; i < GameManager.instance.playerStats.Length; i++)
        {
            if(GameManager.instance.playerStats[i].gameObject.activeInHierarchy)
            {
                GameManager.instance.playerStats[i].AddExp(xpEarned);
            }
        }

        for(int i = 0 ; i < rewardItems.Length; i++)
        {
            GameManager.instance.AddItem(rewardItems[i]);
        }

        rewardScreen.SetActive(false);
        GameManager.instance.battleActive = false;

        if(markQuestComplete)
        {
            QuestManager.instance.MarkQuestComplete(questToMark);
        }
    }
各クエストに設定(ウィンドウ表示用スクリプトの設定に追加)
  • 報酬の有無のフラグをウィンドウ表示用スクリプトに追加
  • 報酬(経験値)の設定をウィンドウ表示用スクリプトに追加
  • 報酬(アイテム)の設定をウィンドウ表示用スクリプトに追加
  • 報酬(お金)の設定をウィンドウ表示用スクリプトに追加
if (isReward)
{
    if (!QuestManager.instance.questMarkersGetReward[questNameNo])
        {
            QuestRewards.instance.OpenRewardScreen(
                questRewardExp, 
                questRewardItems,
                questRewardGold
            );
            QuestManager.instance.questMarkersGetReward[questNameNo] = true; 
        }
}
スクリプトと報酬ウィンドウのテキスト情報との紐付け

UIの設定オブジェクトにクエスト報酬スクリプトを追加して報酬ウィンドウの変数に紐付けする。
f:id:a1026302:20201110024551p:plain

プレイ動画

www.youtube.com