AlayaElla

主要写写游戏制作方面的文章

笔记:任务管理器的实现

前言:

好久没有更新的博客了。。
其实这个功能已经做完很久了,现在做笔记可能只能算是一个记录罢了。
这个功能还是给之前的那个游戏做的,因为想着在游戏里加上任务会更加有目标感,而且更好的玩家引导,所以加了这个功能。
最开本来以为可以直接基于之前的事件管理器加一些功能加好,但是实际做起来发现并没有这么简单。。

需求:

1、使用配置表。
2、任务需要分类型。(如:主线任务、支线任务、隐藏任务等)
3、需要任务线这个概念。(即:任务是按组划分,一个大任务可能由多个小任务组成,在任务面板中就可以对组进行折叠。)
4、任务完成有奖励,且需要到对应的地点领取。
5、任务完成前的描述和任务完成后的描述不一样。(为了在任务完成后,提醒玩家去哪里领奖励。。)
6、各种触发的条件。。总之就是后面好添加。
7、UI表现
8、任务没有完成时会一直显示在UI上。

实现思路:

首先任务的触发准备直接使用事件管理器的方法来触发因为事件管理器的检查方法已经足够完善了。
现在只需要在事件管理器中增加一个触发事件键后添加任务的方法即可用来触发任务了~
然后再在获得奖励的同时检查事件的即可实现连续领取任务的功能。

那么最重要的还是任务系统的整体构架。
这次任务管理器中我主要是这样划分的。

QuestManger(任务管理器):

任务结构体

    public struct QuestBase
    {
        public int ID;
        public int Questgroup;
        public int GroupID;
        public string Smallicon;
        public string Bigicon;
        public string name;
        public string des;
        public string completedes;

        //达成条件
        public struct QuestCompleteBase
        {
            public QuestTypeList QuestType;
            public int Num;
            public int[] Parameter;
        }
        public QuestCompleteBase QuestComplete;

        //奖励
        public struct AwardBase
        {
            public int Gold;
            public int Exp;
            public int[] Goods;
            public int GoodsNum;
            public int Event;
            public int TaskPoint;
        }
        public AwardBase Award;
    }

任务类型

    public struct QuestGroupBase
    {

        public int ID;
        public GroupTypeList GroupType;
        public string Name;
    }

    //任务类型
    public enum QuestTypeList
    {
        PutGoods = 0,       //上架物品
        SellGoods,          //售出物品
        ComposeGoods,       //合成物品
        CollectGoods,       //采集物品
        ComposeProperty,    //合成属性
        Arrive,             //到达路点
        Golds               //持有金币数
    };

    //任务类型
    public enum GroupTypeList
    {
        Main = 0,         //主线
        Sub,          //支线
        Secret       //秘密
    };

添加任务
public void AddQuestToList(int questID)
添加对应ID的任务到任务列表,这个列表同时也会调用QuestUI中的任务显示方法。

移除任务
public void RemoveQuestToList(int questID)
移除完成的任务。

检查任务
public bool CheckQuestListWithGoods(QuestTypeList EventType,CharBag.Goods goods,int point)
根据任务类型和任务物品检查任务,如果检查成功则增加任务进度。

检查是否到达任务路点
public bool CheckQuestListWithArrive(int point)
任务需要在任务地点领取奖励才算完成,这个方法就是用于检查是否在任务地点的。

XmlLoader(配置表读取工具)

直接贴xml格式吧。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<QuestList>
    <Quest ID="1" Questgroup="1" GroupID="1" Smallicon="actionIcon_20" Bigicon="actionIcon_18" Name="开店第一步" Des="上架一些&lt;color=red>坚硬的兽牙&lt;/color&gt;来吸引客人进店吧。" CompleteDes="回到商店吧~">
        <Complete QuestType="PutGoods" Num="3" Parameter="0,2"/>
        <Award Golds="500" Exp="10" Goods="0,1" GoodsNum="1" Event="1001" TaskPoint="0"/>
    </Quest>
    <Quest ID="2" Questgroup="1" GroupID="2" Smallicon="actionIcon_21" Bigicon="actionIcon_19" Name="第一桶金" Des="&lt;color=red>坚硬的兽牙&lt;/color&gt;虽然不是什么好东西,但是卖出一些还是可以勉强维持生计的。" CompleteDes="回到商店吧~">
        <Complete QuestType="SellGoods" Num="3" Parameter="0,2"/>
        <Award Golds="200" Exp="20" Goods="0,2" GoodsNum="2" Event="1" TaskPoint="1"/>
    </Quest>
</QuestList>

EventManager(事件管理器)

之前做的事件管理,现在事件管理器中增加一个addquest的方法,在触发事件后可以增加任务。

以上是现在实现的任务管理器的所有思路。
因为是第一次做这个功能,可能有不太好的地方,欢迎指正。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注