unity 3D RPG高级教程(十四)

Unity 3D RPG任务系统高级教程
本教程介绍Unity 3D RPG游戏任务系统的高级功能,包括QuestGiver控制任务对话显示,GiveRewards领取任务奖励,以及SaveQuestManager保存任务数据。详细讲解了如何实现在NPC交互时动态更新对话内容,任务完成后获取奖励并更新库存,以及任务状态的保存与加载机制。

目录

声明

1. QuestGiver 控制任务对话显示

2.GiveRewards 拿到任务奖励

3.SaveQuestManager 保存任务数据


声明

本教程学习均来自U3D中文课堂麦扣老师

1. QuestGiver 控制任务对话显示

现在来实现NPC能根据我任务的情况给我不同的对话,比如说第一次对话的时候是开始任务,任务过程进行当中要返回进行当中的对应的对话,结束的时候要有结束任务的,完成这个任务拿到奖励之后我再去找他对话的时候又是另外一个对话,所以可以看到我们需要在这里面不断地切换我们的Dialog Data,那么我们会创建一个代码来实时的替换我当前NPC要说的那个对话的数据,那我们先创建一下这个代码:

我们去到我们的Quest当中,我们在我们的Logic里面创建代码QuestGiver:

挂载到NPC身上

 可以看到现在我们的NPC身上有一个DialogController,所以我们的Giver也要拿到Controller的使用权,然后将QuestGiver里保存的数据实时更新到我的currentData,那么我每次跟它对话的时候就会显示不同的内容了,所以我的任务也需要做一些更改,比如说我的NewTalk,我要给它改个名字,Hero Start,也就是Hero第一次开始的时候对话的内容,然后我也会创建更多的Data去检测它任务进行中的对话和结束的对话,

先来写一下QuestGiver:

[RequireComponent(typeof(DialogueController))]
public class QuestGiver : MonoBehaviour
{
    DialogueController controller;
    QuestData_SO currentQuest;

    public DialogueData_SO startDialogue;
    public DialogueData_SO progressDialogue;
    public DialogueData_SO completeDialogue;
    public DialogueData_SO finishDialogue;

    #region 获得任务进度
    public bool IsStarted
    {
        get
        {
            if (QuestManager.Instance.HaveQuest(currentQuest))
            {
                return QuestManager.Instance.GetTask(currentQuest).isStarted;
            }
            else return false;
        }
    }

    public bool IsComplete
    {
        get
        {
            if (QuestManager.Instance.HaveQuest(currentQuest))
            {
                return QuestManager.Instance.GetTask(currentQuest).isComplete;
            }
            else return false;
        }
    }

    public bool IsFinished
    {
        get
        {
            if (QuestManager.Instance.HaveQuest(currentQuest))
            {
                return QuestManager.Instance.GetTask(currentQuest).isFinished;
            }
            else return false;
        }
    }
    #endregion

    private void Awake()
    {
        controller = GetComponent<DialogueController>();
    }

    private void Start()
    {
        controller.currentData = startDialogue;//开始对话数据
    }
}

DialogueData_SO:

    public QuestData_SO GetQuest()
    {
        QuestData_SO currentQuest = null;
        foreach(var piect in dialoguePieces)
        {
            if(piect.quest != null)
            {
                currentQuest = piect.quest;
            }
        }

        return currentQuest;
    }

QuestGiver:

    private void Start()
    {
        controller.currentData = startDialogue;//任务开始的对话
        currentQuest = controller.currentData.GetQuest();
    }

    private void Update()
    {
        if(IsStarted)
        {
            if(IsComplete)
            {
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YTTTA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值