タスクシステムのプログラム設計

タスクはプログラム アプリケーションの一般的なシステムです. ユーザーが役割を引き受けるのを助け, また研究開発, 操作とユーザーの相互作用を助けます. 通常, ユーザーはタスクを完了すると一定の報酬を与えられます.

1.基本的なデータ構造

初期のタスク システムは非常に単純に設計されており、そのほとんどは線形構造であり、リング タスクが存在することもありました。現在のタスクの進行状況を保存するために必要なデータ形式は、次のようなものだけです。

  public class TaskDate
    {
        public int max;//最大进度
        public int current;//完成进度
    }

次に、次のデータ構造であるタスク オブジェクトを格納するための辞書が必要です。

  public Dictionary<int, TaskDate> currentTaskDic = new Dictionary<int, TaskDate>();//当前显示任务
    public Dictionary<int, TaskDate> CurrentTaskDic { get => currentTaskDic; }

ここまでで、最も基本的なデータ構造が完成し、基本的なタスク単位を処理できるようになりました。例:指定されたモンスターを50体倒す。

もちろん、これらは最も基本的なデータ構造ですが、タスクを処理するためには、計画を立ててタイプと構造を決定する必要もあります。一部のシナリオでは、完了したタスクを保存して、ユーザーがタスクを繰り返し受け取ったかどうかを判断する必要もあります。これらのタスクは後で処理できます。

2. 基本機能

一般的なタスク処理は、RBI メカニズムに似ています。例として、「永遠の苦難」からスクリーンショットを撮るタスクを見てみましょう。

上記のタスクは、実際には 2 つのタイプに分けることができます: 1. XX が装備されているときに XX 武器を使用してキルを引き起こす; 2. XX 武器を使用して XX ポイントのダメージを与える.

前者については、キルが発生した際に「○○装備」と「○○武器使用」の2つの条件を満たしているかどうかの判定が必要です。その場合は、完了情報をマネージャーに渡します。

2つ目は、ダメージを与える際に「武器○○を使うかどうか」を判断し、一致する場合は管理者に情報を送信する必要があります。

この段落は、最初に同じトリガー条件を持つタスクをタイプに抽象化し、次にこのタイプのタスクを一様に処理することを意味します。つまり、データは最初に動作に抽象化され、次に何らかのアルゴリズムを使用して動作が処理されます。

したがって、さまざまな複雑なタスクの進行状況を処理し、処理構造を判断する役割を担う TaskProp (タスク マネージャー) には、次のような一般的な処理関数が必要です。

 /// <summary>
    /// 任务类型
    /// </summary>
    enum TaskType
    {
        type2,//2,X1个X2设施达到Y级(其中X2任意X1数量即可满足)
        type3,//3,X建筑下的设施总等级达到Y级
    }

    /// <summary>
    /// 任务进度判断
    /// </summary>
    public void TaskJudgment(int _id,int _num)
    {
        //获取任务类型,通过方法计算
    }

たとえば、ID 15 のタスクは「100 匹のスパイダーを殺す」であり、スパイダーが殺されるたびに TaskJudgment(15,1) を呼び出します。関数本体クラスでは currentTaskDic[15].current を見つけて付加価値処理を行います。条件が満たされると、タスクが完了したと判断されます。

最後に、完了時に受け取る判断が必要です。その後、上記のタスクの報酬を得ることができます。

  /// <summary>
    /// 任务完成回调
    /// </summary>
    public void TaskComplateCallBack()
    { 
        //任务完成之后刷新界面
    }

至此,我们完成了一个任务完整的生命周期,即生成任务=>推进任务=>领取奖励。

3,任务红点等附属结构

当我们完成任务,或者运营推出新任务的时候,通常会使用红点来提醒玩家。虽然现在红点系统已经被滥用到一个有些令人生厌的地步,但某些场合它又是必要的。

红点一般使用树状图结构的数据来处理,即子节点有红点的时候,父节点的红点也会被点亮。

回归到基本的任务单元,我们只要判断是否符合红点条件即可。比如完成某项任务需要领取的时候出现红点,则基本代码如下:

bool _isHint = _taskD.current >= _taskD.max;

然后基于这个判断,我们可以处理UI上相应的红点系统。

4,扩展延伸

以上都是针对最基本的任务单元处理,现在游戏中的任务已经设计的比较复杂,我们需要针对具体的任务结构具体分析。比如环任务、日常任务、周任务、赛季任务、主线任务、支线任务等等,它们有这诸如时间、前置等等限制。

但万变不离其宗,我们只要搞懂基本的数据类型和数据结构,便可以处理这些看似复杂的任务系统。

另外任务系统不单单应用于游戏,硬件单元处理、操作软件这些都包含任务系统的范畴。大到国际运行,小到日常活动,任务系统与我们每个人都息息相关。

5,总结

写任务系统代码的时候,先认真分析任务的结构,然后根据表格抽象出我们需要的数据结构。最后层层处理,以保证系统的正常运行。

おすすめ

転載: blog.csdn.net/Tel17610887670/article/details/128834041