精华内容
下载资源
问答
  • Unity3d 任务系统实现

    千次阅读 2019-11-15 18:45:29
    分享下我rpg游戏的第二部分,任务系统 任务UI 这里没有我背包系统比较繁杂的UI操作,所以大部分时间花在了任务系统控制方面的设计上。 任务系统 说到任务系统,想到,领任务,以及是否完成对应任务,以及任务的各种...

    前言

    分享下我rpg游戏的第二部分,任务系统

    任务UI

    在这里插入图片描述
    这里没有我背包系统比较繁杂的UI操作,所以大部分时间花在了任务系统控制方面的设计上。

    任务系统

    说到任务系统,想到,领任务,以及是否完成对应任务,以及任务的各种状态等等
    秉持着MVC的思想,大致分为以下设计:

    1. Mission类
      在这里插入图片描述
      这里我把任务简单分为两类:寻人以及击杀特定数目的怪
    2. MissionModel类
      在这里插入图片描述
      这个类里存放了各种对数据的操作
    3. MissionCtrl类
      在这里插入图片描述

    心得

    其实以上内容都是很简单的操作,任务系统的主要问题是比如,我要杀多少只特定的怪,我该怎么去判断任务什么时候完成,我的做法是:
    在这里插入图片描述
    这是CTRL类里面的方法,这里注册上给怪死亡之后执行的事件,然后枚举所有已经领过但是没有完成且是杀人类型的任务,如果找不到,说明不在任务列表里,找到了,那就更新一下状态,同理,寻人我也是这样做的。

    结语

    希望可以学到更多东西,努力成为主程,嘿嘿,欢迎有问题私信我

    展开全文
  • 游戏任务系统设计思路

    千次阅读 2016-11-09 15:59:00
    为什么要设计任务系统 1. 体现世界观世界观 指主线剧情,历史背景,塑造主角的成长历程。 WOW中的任务虽然不是必须完成的,但是顺着部落主线的剧情延伸至南海镇的任务却是很明显的主线剧情,从亡灵新手村...

    一.为什么要设计任务系统

    1. 体现世界观世界观

    指主线剧情,历史背景,塑造主角的成长历程。

    WOW中的任务虽然不是必须完成的,但是顺着部落主线的剧情延伸至南海镇的任务却是很明显的主线剧情,从亡灵新手村学会了如何和死尸打交道,并且如何与已故的亡灵战士沟通成了亡灵族的本能,那么下面任务就是完成赫尔库拉的复仇任务。

    //希尔斯布莱德丘陵的赫尔库拉的复仇任务,部落的做这个任务有点难度,因为目的地是联盟的城镇,很容易被卫兵和联盟的玩家追杀。经历N次复活的艰辛之后,努力终于有了回报,复活后的赫尔库拉召唤出一群骷髅兵攻击南海,虽然。。。最终还是难免被南海的卫兵围殴至死,不过咱心里还是爽了一把。

    2. 营造世界氛围

    指支线剧情,烘托世界营造世界环境,以及地区性特点的营造。这个任务是营造了烈日石居的地区特征,一个被污染的土地,那么崇尚自然的牛头族的希望是什么,是为这片不毛之地带来新的生机。

    //种植盖亚之种 将10枚盖亚之种种植在盖亚土堆中,然后与烈日石居的塔姆拉谈一谈。如你所见,盗贼,我纯净的心灵可以为这片不毛之地带来新的生机。你必须将这些种子种植在破坏之源中,在西边的焦炭谷里就是破坏大自然的源泉——这片被污染的土地上到处都是鹰身人和凶恶的火元素。邪恶狂风,拿着这些附有魔法的盖亚之种,把它们种植在盖亚土堆里。

    3. 角色扮演的真实体验

    模拟真实的事件流程以及所参与的人物。

    《驯服的科多兽》的任务便是让你体验如何驯服一头巨大的科多兽,既要避免成年科多兽的攻击,又要引诱老年的科多兽进入你的圈套。

    //带5头驯服的科多兽和科多兽诱引器给瑟卡布斯库营地的斯米德•瑟卡布斯库。比布莱认为他是凄凉之地唯一一个懂得赚钱的地精。好吧,想要让旅团闯过这块地方就要靠我了。因为我懂得利用我的科多兽诱引器控制年老的和濒死的科多兽,所以我和旅行队的主人科克,瑞格进行了合作。把科多兽诱引器拿去使用在任何年老的或者濒死的科多兽身上。然后那个野兽就会变成驯服的科多兽然后会跟着你。一旦你驯服了一头科多,那就把它带来给我吧。

    4. 系统关键点,功能开启。

    触发特殊系统功能的开启。WOW世界中的职业任务是系统功能的开启,任务完成之后将会获得本职业的特定技能或者特定的技能道具。以下是部落萨满的水图腾任务。

    //到南贫瘠之地去找到布瑞恩。关于水,有一点是你必须要了解的:水意味着重生。水流动着,消蚀和清洗一切事物。水的治疗和恢复能力是无与伦比的,但这只有在水是完全纯洁的情况下。如果水受到了污染,那么它将毁灭一切它接触到的东西。理解了这一点,你就应该能明白保证水源的纯洁性是多么的重要。如果你想要得到水之灵契,就到南贫瘠之地去找布瑞恩吧,她的家园最近时常受到野猪人的骚扰。

    5. 任务引导

    指引玩家操作和明确系统功能。例如WOW的任务《把受难药剂交给乌比》,这个是区域指导任务。

    //我得花一会儿时间把这些成分混合在一起,做成受难药剂。成功了!啊,还有什么能比给这个世界带来点灾难更让人愉快的呢?让我们看看这种药剂能不能达到预期的效果。让我的助手乌比瞧瞧黑暗女王为人类和天灾军团准备了什么样的礼物。当玩家接到这个任务的时候已经50级或以上了,那么这个任务完成之后,便引导玩家去西瘟疫之地的天灾军团了,那个地区是50级玩家的练功区。

    二.任务系统的基本规则

    一个完整的任务包含三块内容,触发任务——执行过程——完成任务。具备了这三个基本条件,就算是个完整的任务了,那么其中多种的形式变化以及内容表现的丰富性为任务体系增添了血肉。

    1. 任务的触发

    根据任务触发的形式不同,可以分为以下形式:

    •条件触发形式 当满足一定条件的情况下,自动产生或固定NPC领取任务。

    •固定领取形式 最常规的任务获得模式,通常情况下受一定范围条件的限制。

    •随机触发形式 在任何场景任何等级段随机获得任务。

    •连锁任务形式 由一部份人触发,完成后引发另一部分获得任务。

    根据任务触发的类型不同,可以分为以下类型:

    •物品触发。拾取或者使用特殊物品时触发任务。

    •NPC触发。指玩家从某个NPC处得到该任务。

    •区域触发。指玩家进入某个区域后即触发该任务。

    •时间触发。指玩家经过一段游戏时间后可以得到该任务。

    任务触发的情况可以是多种形式的组合,也可以是多种类型的组合,同时一个任务触发既满足条件触发形式、又满足了固定领取的形式。

    2. 任务完成过程

    任务完成过程会通过各种形式来进行,以下列举了其中8种最常用的任务完成形式,该形式库的内容将根据需要进行不断的扩充,仅供参考。

    1)战斗。

    程序实现难度最低,只要验证所杀的怪物(数量)即可。应该说,这种任务在WOW里所占比例最大,在其他网游的任务系统中也最常见。因为这种任务系统的实现没有很大难度,程序只要安排任务指定NPC、任务对话及任务完成检测,而且也是最容易安排剧情的任务类型。

    所需消灭的怪物分为两类,一是普通的怪物,一是BOSS类怪物。普通的怪物就不必多说了,BOSS类怪物有些还需要触发条件,例如十字路口的狂热的维罗格任务,消灭半人马一定数量后才会出现,还有十字路口的艾其亚基任务,要在它的巢穴附近吹响号角来召唤它。

    2)收集物品。

    收集的物品分以下四类:

    ⑴、 指定怪物必然掉落物品

    //WOW中十字路口的偷钱的迅猛龙任务,杀死迅猛龙会获得钱币

    ⑵、 指定怪物随机掉落物品

    //梦幻里的任务链系统,每环需要的物品可以通过杀死自己同等级的怪物有几率获得。

    ⑶、从地图上可见并可采集之物品

    //WOW十字路口的采集菌类孢子任务

    ⑶、 可以由玩家制作出来的物品

    //梦幻中的师门任务、修炼任务、任务链有很多是需要收集玩家制作的物品。

    3)对话任务。

    最简单的任务过程形式,与指定NPC对话。大多数MMPRPG最常用的任务过程形式。

    4)护送任务。

    保护目标NPC到达目的地,路上一定地点会刷新怪物,这时候要注意不能让目标NPC死亡,否则任务失败。最典型的是哀嚎洞穴的护送牛头德鲁伊任务。程序实现:固定地点刷新怪物,判断目标NPC是否死亡,死亡则转入任务失败,任务结尾若NPC仍存活,任务完成。

    5)探索任务。

    一般的要求是到达探索地点的规定区域内即可完成,供玩家熟悉地图用。有些任务还要求发现某特征事物,例如十字路口的遗忘之池任务,在池水中观察到有冒泡的地方,需足够接近方可完成。

    //很久以前,贫瘠之地曾是个郁郁葱葱、生机盎然的地方。但是战争与灾难接二连三地降临在这片土地上,最后就剩下了这一片干燥荒芜的不毛之地。事实就是这样,真让我伤心。不过,在过去的几年里,贫瘠之地出现了新的绿洲,生机又在这片土地上重现。我们德鲁伊感觉到了在很深的地下有一股试图冲出地面的力量。我们必须找到这股力量的源泉,请到十字路口西北边的遗忘之池去一趟,在那里的湖水中搜寻力量的源泉,然后回到这里来。

    6)捕捉

    这种形式的任务通常需要玩家利用特定的技能或道具去捕捉怪物,也因此可以产生与场景互动的小游戏,例如WOW中黑海岸的捕获白熊的任务,给玩家一个陷阱道具,玩家发现白熊后安放陷阱,之后引诱白熊进入陷阱,捕获成功后白熊会跟随玩家到达指定地点完成任务。

    7)摧毁

    摧毁某个特定物件,摧毁的执行需要一定时间才可以完成,并且在任务过程中会受到怪物的干扰。例如WOW中的摧毁巴尔莫丹的飞行器,然后向加恩•石塔回复。

    //按照卡兹戈姆的日记上所述的方法制造出来的炸药应该不会有问题。那么,我们开始吧。首先我有一项特殊的任务要交给你完成。拿上这只爆破筒,去炸掉巴尔莫丹的飞行器。这个飞行器不仅是巴尔莫丹军事设施的关键部分,也是一架可怕的杀戮机器。更重要的是,它是权力的象征,而它对我们的部族来说则代表着一段耻辱的回忆。我会为你的成功感到自豪,你也将得到丰厚的奖励。

    8)送物品

    这类物品一般是在完成收集形式的任务之后进行后续任务,玩家在上一个任务中收集物品之后,在本任务中将特定物品交个特定NPC或者将特定物品安放在某个地点。例如梦幻和大话中的跑镖任务,将镖送至特定NPC,中途会受到强盗的堵截,需要消灭强盗完成任务。

    以上只是列举的任务过程中最常见的几种任务过程形式,任务系统得设计中这些形式会不断创新与交织,形成更庞大的任务体系。

    3. 任务的完成

    任务的完成是对任务过程的一个体现,好比任务需要你获得10个飞鱼的鳍,那么在任务的执行过程中,你获得的累积数量达到10个,将鳍带给指定NPC,任务就是完成了。所以任务的完成和过程可以为一体,任务的执行也就是任务的完成。另一方面任务的完成也有可能是另一个任务开启的条件,那么完成和触发也可能是任务系统同步进行的事件。

    4. 任务的奖励

    1)任务的奖励内容

    物品 金钱 经验 称谓 积分

    2)任务奖励的形式

    随机 玩家随机获得某项内容奖励

    指定奖励 玩家完成任务之后一定会获得某项奖励

    可选奖励 玩家任务完成之后可以选择奖励内容,一般在任务链体系中玩家获得积分,当积分累积到一定程度,玩家可以换取所需要的奖励内容。

    3)任务的难度

    任务的难度可以通过以下几个方面进行综合控制,玩家任务需求等级、玩家任务完成时间、玩家需要杀死的怪物数量、玩家完成任务所需要的技能要求、玩家完成的风险程度。可以通过建立一张难度控制表来规划任务的难度需求。

    难度系数 玩家任务需求等级 玩家完成任务时间 玩家需要杀死的怪物数量 玩家完成任务所需要的技能要求 玩家完成的风险程度

    10 80 10分钟 20 熟练度1000 10

    9 70 6分钟 10 熟练度800 9

    8 60 5分钟 8 熟练度500 5

    …… 50 4分钟 7 熟练度100 4

    每一项内容都可以给与固定的分值,当所有需求项目的分数汇总后得出的难度系数就为任务的难度了,所有任务体系中涉及的内容都可归纳到本表中进行统一规划。

    //以下内容为玩家分析的WOW中的任务等级控制,仅供参考。

    先说单个任务的难度控制。在普通的链状结构任务中,难度都是循序渐进的。例如荆棘谷的摩克萨尔丁的魔法,任务的起始是从杀深喉猎豹(37---38级)开始的,第二步要获得的物品是从丛林捕猎者(39—41级)那里得到的,第三步成年大猩猩的肌腱所需杀的怪等级38---41,最后一步要从纳加的圣泉中取到圣泉之水(纳加等级43—44)。注意到这些任务能够单独完成所需等级是一步步慢慢增加的。所以链状任务设计的时候,切忌任务之间跨越等级太大,或者任务越后面难度越低。等级跨度太大,给玩家无所适从的感觉,再加上当前能力无法完成任务,造成放弃任务的几率大大增加;任务难度安排颠倒,越到后面越没挑战性,结果给玩家的成就感也就降低了。

    再说整个游戏的难度控制。仍以魔兽为例(副本也算做任务的一部分)。

    1-5级时,玩家在新手村活动,这时候的任务一般以杀怪、收集物品和探索为主,设计时就要注意把相关的任务难度调低,让新手在任务中快速熟悉游戏的玩法。例如杀怪任务可以减少完成任务所需怪物数量和削弱初级怪能力,收集物品任务所需物品必须大而显眼,探索任务目的地离新手村要近。而且关键是都要有详细的说明,指明任务所在地是必须的,让玩家在完成任务时不至于没有任何头绪。

    6-12级时,玩家一般会离开新手村到达第一个城镇,除了前面所述几种任务之外,还要适当加上消灭普通BOSS的任务,这种任务高级点的玩家可以单独挑战,低级点的玩家必须组队才能战胜。在一定程度上促进了玩家交流和组队,增加了游戏交互性。

    13-20级,这时候玩家已经对游戏玩法有足够的了解,所需的就是大量的任务来提高玩家的技巧(包括个人能力和团队配合能力),第一个需要配合的副本任务在这样的前提下诞生了(如奥格瑞玛的怒焰峡谷),在副本里强调团队的配合,一个人的失误都有可能带来团队的毁灭。不过做为第一个副本,难度一定要控制好,地图不能太复杂,怪物密度不能太高,BOSS能力不能太强。

    21-30级,基本同上,不过此时的任务考虑加入一些技巧或噱头,添加大量的隐藏要素,使不同的玩家在完成不同的任务时有不同的体验。这个时期的副本可以适当加大难度。(十字路口的哀嚎洞穴副本是这个时期必进的一个副本,在细节方面和难度方面都处理的很不错,不过唯一不足的是地图实在太复杂,去过两三次的人也未必会熟悉,至于我,在走了八遍以后才勉强记住。)

    31-40级,这个阶段玩家一般会在中立地区活动,与敌对阵营的摩擦也日益增加,组队完成任务的玩家会占很大一部分。所以可以增大团队才能完成的任务比例,还有一些需要良好操作控制的任务。副本中怪物的密度可以增大,考验团队处理突变状况的能力(如剃刀高地的2精英3普通怪和巡逻怪组合),BOSS的技能和AI增强,让玩家自行摸索战胜BOSS的技巧。(如诺莫瑞根的最终BOSS,打他的时候旁边的炸弹发射器会不停放出炸弹来攻击玩家,需要一个人去关炸弹开关。)

    41-50级,到这个级别的玩家一般都已经具有良好的操作和对自身职业足够的了解,单独完成任务的欲望强烈,可以考虑降低团队任务比例。副本难度大幅度增加,一些区域需要特定职业的技能才比较容易通过(如奥达曼的矮人群,范围魔法可以发挥的淋漓尽致),一些区域需要玩家消耗大量的药品(如马拉顿的毒水BOSS,滋补药剂和治疗药剂的应用),打BOSS需要技巧和运气(马拉顿的公主,战士积累足够仇恨,盗贼和法师、猎人主输出伤害,牧师照顾战士的同时又要注意不被公主盯上。对付公主的大范围毒气,近战的要轮流上阵。对付公主的打飞能力,战士要靠墙站。)

    51-60级,这个时候出现了全新的任务类型,大型团队任务(RAID队伍),需要5个以上、40个以下的玩家协同完成。这些任务也是对玩家的极大挑战,不仅普通小队无法完成,即使是RAID队也要良好的配合和正确的战略指导才有可能战胜。在丰厚的奖励和诱人的物品掉落面前,会有玩家不停的组织人手来击杀BOSS,如尘泥沼泽的黑龙公主、艾萨拉的蓝龙、熔火之心的火焰领主等。这个时期的副本,几乎每一波敌人都是一个挑战,一旦处理不慎,团队覆灭是很正常的,技巧+战略+运气,一个都不能少,才能完成高难度的副本任务。

    因此要随着游戏的进程的编排任务的方方面面,合理地估计玩家该阶段的能力,做出最佳的任务安排。

    5. 任务的互动模式

    任务的互动模式可分为两大类,合作模式与竞争模式。

    1) 合作模式

    是多个玩家为达到一个共同的目标进行合作完成一个任务模式。例如WOW世界中的开启安琪拉大门的任务,需要联盟与部落的玩家共同收集一定数量的物品,在特定的时间收集完毕后安琪拉副本大门便会开启。

    2) 竞争模式

    竞争模式是多个玩家为达到一个共同的目标之间进行博弈的一个任务模式,这个模式可以划分为良性竞争和恶性竞争两种情况。

     恶性竞争

    大话2中的地星系统,高额奖励以及争夺目标是唯一的,经常引起帮派霸星,以及大规模的PK,也许有人会认为这也是玩家进行游戏的动力,但是这种刺激是短暂的,无论PK的双方哪一方赢得胜利,这都将以玩家离开而终结,这不是我们想看到的结果也不是我们提倡游戏环境。

     良性竞争

    领取任务的玩家有自己独立的争夺目标,玩家之间不会相互干扰,并且胜负是以玩家的完成时间或是完成策略的优异性进行评定,例如梦幻中的游泳大赛,玩家各自组成一支队伍,其间需要和13个不同地点的NPC对话,并有几率触发战斗,最后成绩是看谁先完成13个NPC的对话,这种情况就不会引发玩家之间的恶性竞争。

    合作模式与竞争模式也会同步存在,例如梦幻中06年的暑期活动花妖任务,玩家杀死花妖后会有几率获得花妖的种子,将种子种植在特定的区域内,每个服务器都将固定时间段内计算玩家种植的种子总数,数量排名前十的服务器,玩家的双倍时间将会增加4小时。可以看出任务的前半部分是一种需要玩家合作的模式,而后半部分则是需要玩家服务器之间的竞争模式。

    三.任务设计的注意事项

    1. 引擎功能

    1) 阻挡

    通过地图阻挡产生的任务限制,通过地图上的阻挡区域来执行游戏规则,这个已经被单机游戏用到滚瓜烂熟了,但是作为网络游戏,以及我们游戏引擎的限制,通过阻挡实现游戏规则,这条非常的困难,目前程序是极力反对此种做法的。

    一是网络游戏中玩家的网速不同,网络延迟有极大可能造成动态阻挡区域的生成或信息传播,有些阻挡在网络延迟的情况下可能消失,所以通过阻挡产生的游戏规则目前受到网络环境的影响,还不成熟。

    二是我们的引擎的优势并非体现在动态阻挡上,因阻挡形成的游戏规则在引擎的执行力度上会大打折扣。

    2) 控制玩家

    我们的引擎尚不能支持系统控制玩家,所以对玩家的操作,以及与NPC对话时玩家的系统对话目前不能实现,但是我们可以先制定需求,以及其他的实现途径,根据最后的引擎实现力度进行调整。

    2. 网络游戏特性

    1) 网速

    网速一直是网络游戏实现的最大障碍,只要是网游那么都会存在网络延迟的问题,只是不同的ISP与用户之间延迟多少的问题,那么体现在我们的任务设计中就需要极力避免挑战网速的任务。

    任务长度拉的越长,网络迟延带来的负面影响则越小。例如科举任务,回答问题,考验玩家的知识量,问题越多则玩家越贴近任务设计的核心。

    2) 刷新

    网络游戏中存在刷新问题也是我们需要注意的地方,常规战斗中我们的遇敌方式是明雷,任务系统中也会遇到类似的设定,把握好刷新时间是一个尤为重要的问题

    3) 脚本播放时间

    脚本的播放时间也如同刷新一样需要把握时间问题,多长时间最合适。

    3. 任务表现形式

    1) 任务的文字信息量

    这里的任务文字信息量是指与NPC对话的文字信息,同一页的文字信息量超过四行,玩家阅读时将会产生烦躁感,另一方面,网游也区别于单机游戏,单机的RPG更多是在体现剧情的跌宕起伏,玩家可以花上更多时间反复体验一种剧情甚至忽视奖励的存在,但是网络游戏不同,玩家每分每秒都在支付的时间费用,如果不能在短时间内容给以丰富的刺激体验,那么玩家有极大可能会选择放弃这段冗长文字却感人至深的剧情。如果玩家选择跳过,那么文案辛苦修筑的华丽辞藻此刻被玩家一键搞定,同时剧情任务也失去了体现世界观、营造世界氛围的作用。

    2) 任务流程长度

    常规任务流程不宜过长,这很容易引起玩家对任务的厌恶感,梦幻中的剧情任务很多是让玩家在两个NPC之间来回奔波,极度引起疲劳,同时兴奋点拉长之后,玩家容易就陷入迷茫,针对一些上线时间不长的玩家,过长的任务流程将意味着将那些短时间上线的玩家拒之门外,这就如同WOW的高端副本,让很多休闲工会流失了不少玩家,以至于不能生存下去,并且对于单人来说,让低在线,高技巧型的玩家在服务器中处于中下水平。

    4. 任务玩法

    1) 任务设计中的小游戏

    任务设计中运用小游戏的手法,可以极大的丰富任务的形式,并且能给任务执行过程带来乐趣,但是任务中小游戏的加入强烈建议不要通过切图的方式进行,那将极大地破坏通过各种努力营造的游戏真实体验,切图进行小游戏只会让任务以及各种表现力降低。切图的不是不可以做,要做就放在固定的场景氛围之中,你大可在傲莱游乐场玩到你想玩的任何小游戏。WOW中的钓鱼、烹饪,都是在当前场景中直接进行的小游戏,并未切图,这就是为了给玩家带来真实体验。

    2) 玩家回答问题

    在任务的设计中我们会加入问题让玩家选择答案,那么这种设定我们就需要考虑到我们的出发点是什么,是让玩家获得更多的知识——在娱乐中学习,还是通过高难度的问题带给玩家焦虑,如果带给玩家的焦虑,我们是否有设计释放焦虑的玩法,让玩家产生快乐。《游戏的设计与开发中》提出游戏中焦虑的产生和释放就如同在交响乐作品中,作曲家通过反复重现一个旋律片段,使我们进入某种情感体验,但随着旋律重复的继续,我们开始期待着它的变化和完成,产生疑惑、焦虑的情绪,随着时间的流逝,听众的紧张度越来越大,迫切需要从这种精神状态中解脱出来,这时作曲家等待听众的紧张度达到承受的极限后,马上使用与上一个旋律截然对立的另一个旋律来打破上一个旋律,从而使听众从某一个感情的高点跌落下来,获得强烈的解脱感。

    展开全文
  • 分布式任务系统cronsun

    千次阅读 2017-12-20 00:00:00
    一、任务系统图 1图 2说任务系统的话大家想起的就是要执行任务了,什么时间什么地点做什么事情。图 1 是简单的任务,在每天 8 点输出 Hello Gophers!,大家用的比较多的任务系统就是 crond,其实这个系统(图 2)也...

    一、任务系统


    图 1

    图 2

    说任务系统的话大家想起的就是要执行任务了,什么时间什么地点做什么事情。图 1 是简单的任务,在每天 8 点输出 Hello Gophers!,大家用的比较多的任务系统就是 crond,其实这个系统(图 2)也很简单,就是守护进程加一个任务列表。


    |早期的 cron

    说一下早期的 cron,早期的时候(大概在80 年代在 Unix 系统里面 cron 运行逻辑

    1. /usr/lib/crontab 文件

    2.如果有命令要在当前时间执行,就用 root 用去执行命令

    3.每秒钟去运行一次,有就执行,没有就重复,比较简单


    |支持多用户的 cron

    -Unix System V,1983

    1. 启动的时候读取所有用户下的 .crontab 文件

    2. 计算出每个 crontab 文件里需要执行的命令的下一次执行时间

    3. 把这些命令按下一次执行时间排序后放入队列里

    4. 进入主循环

    • 计算队列里第一个任务的执行时间与当前的时间差 

    • Sleep 直到第一个任务执行时间

    • 后台执行任务

    • 计算这个任务的下一次执行时间,放回队列,排序

    后面发展成支持多用户的,这时候的执行算法改了。这相当于按照时间顺序排列,谁先执行的就放在那里,计算现在的时间与下个时间间隔,再让程序暂停,需要时唤醒程序执行,然后重复。


    |近代的 cron

    Linux,1991

    1. Vixiecron(PaulVixie1987)

    2. Version3Vixiecron(1993) 

    3. Version4.1ISCCron(2004) 

    4. anacron,dcron,fcron


    现在的话 90 年代,大多数的都是用 4.0 的版本。大家用了这么久,基本都是在一些单机上跑一些任务,也是这样的操作。功能很简单,一个时间的规则,一个命令,如果公司有很多服务器的话,维护起来就不方便了,必须得一台一台去管理的或者是用脚本管理,多机器的情况下任务维护成本较高。

    而且如果单机的话,如果失败了之后怎么办?就无法继续了,如果能做成分布式的就好了。


    二、分布式任务系统


    |分布式任务系统特点

    • 分布性

    • 对等性

    • 并发性

    • 缺乏全局时钟 

    • 故障总是会发生

    分布式系统有什么特点呢?大概的特点就不延伸了,大家可以理解为把一个简单的软件放在多台机器上,然后多台机器是都可以完成这个任务的。那么分布式的 crond 的问题,怎么解决呢?

    图 3

    第一个就是把守护进程做成多个分布式的进程(图 3),把命令分布在数据库里面,这是最简单的实践方式。


    |市面上的一些任务系统

    • Azkaban 

    • Chronos 

    • Airflow 

    • dkron

    • swoole-crontab 

    • Saturn

    现在我们也想用一个这样的东西,一开始的时候找了市面上的方案,如上述现在市面上有很多方案,国内国外都有,最后一个是唯品会弄的,我挑几个讲一下。

    1.Azkaban 是一个 Hadoop 上的任务管理,提供功能清晰,简单易用的 Web UI 界面,也提供 job 配置文件快速建立任务和任务之间的依赖关系等等好处,但只能对 Hadoop 做任务管理,符合我们的要求,我们的要求是替换单机版的 crond

    2.Chronos 适合在容器编排管理工具上的调动,里面全部是替代了 crond,里面有 UI,也有灵活的调度,但是要依赖于容器,对于我们来说应该还有更好的方案。

    3.Dkron 这个就比较接近我想要的东西,比较简单高可用,也可控。但是不好的就是对任务的支持比较简单,而且都跑在容器上,相当于替换成容器。因为我们的机器很多都是本地任务需要无缝替换 crond,因此也不考虑。


    |需求

    对很多任务系统进行考察之后,我们有一下需求:

    • 可替换 crond

    • 分布式、高可用

    • 支持多种任务属性

    • 易用

    • 易部署

    因此,我们开发了 cronsun。


    三、cronsun


    图 4

    图 4 是 cronsun 的系统架构,简单来说就是把任务存储在一个分布式 etcd 里,单个 crond 部署成一个服务,也就是node.1\2\3等等部署下去,再由 web 界面去管理。


    |cronsun 特性

    • 部署简单

    • Web界面统一管理任务

    • 任务失败重试

    • 任务失败邮件提醒

    • 多机单任务(防止单机挂掉任务不按时执行)

    • 单机任务并行数限制

    • 执行单次任务

    • 多机器严格的时间间隔任务

    • 支持安全性配置,可以限制任务脚本的后缀和执行用户

    • ....

    现在看一下 cronsun 的特性。首先第一点就是部署简单,只需要在每个机器上部署 crond 节点再部署一个界面管理就可以了。如果 cronweb 挂掉了,只是这个界面不能对任务进行更新,但是不影响任务节点运行,也就不影响任务的执行。其他的任务属性也讲了,最主要的是对任务有几种任务类型,就是可以在单台机器替换 crond ,也解决单点的问题。比如说某个机器死了另外一台机器就会执行这个任务,保证任务执行。


    |cronsun 主要组件

    图 5

    cronsun 主要有 3 个主件,都是通过 etcd 通讯的。cronnode 负责节点的分组及节点的状态,croeweb 是管理任务的、执行结果都可以在上面看。


    |任务类型

    • 普通任务,和 crontab 中的任务一样

    • 单机单进程任务,普通的 crontab 任务是单机的,如果执行任务的机器出现问题,任务可能执行失败。 cronsun 提供此任务类型是保证有多台机器可以执行一个任务,但在执行任务被执行时,只有一台机器在执行任务

    • 一个任务执行间隔内允许执行一次,这个类型的任务和单机单进程任务类似,但限制更严格。因为多台机器间,时间可能会不一致,而某些任务要求执行的时间间隔要严格一致时,可以考虑采取这种类型

    刚才说的任务就是这 3 种类型,单机单进程是只想在一台机器上执行,有 n 个节点,但是只会在一台机器上执行结果。此外还有一种情况,假如有3台机器,每台机器的时间不一致的话,这种任务保证在一个时间间隔内,不管机器时间差怎样,保证只执行一次,不重复执行,解决机器时间不同步的情况。


    |任务属性

    • 失败重试

    • 超时设置

    • 安全设置

    • 同时执行任务数设置 

    • 分组设置

    任务的属性也大概说一下,如果随便填任务的话,web 任务界面暴露出去人家随便填几个任务就可以攻击你,安全设置只要加了脚本的后缀(就是本机器有的脚本),假如你的机器是安全的,那么整个系统就是安全的。还有同时执行任务数量设置,还有分组设置便于方便管理的。


    |任务定时器

    图 6

    定时器,跟 crontab 是一样的,只是多了一个秒级。crontab 便于集中管理,多台服务器的时候就比较方便,保证了不会单点失败。还有就是简单的任务调度,web 是通过 API 来调度的,如果想使用的话稍微看一下 API 就可以调用了,整个系统大概就是这样。


    四、心得体会

    说一个开发过程中的体会。

    第一个是方案的选择,方案选择一开始的时候基本都有这样的问题,你到底要做什么东西,系统要搞很多东西,我想调度,我想备份,能达成多种任务的系统里面。另外一种就是我把我想要的东西某个点做的很好,基于我们的人力物力,而且我们做的足够好,至于后面想扩展的时候能够扩展就可以了。


    |timer 的使用


    图 7

    如图 7 是一个典型的运用场景,我先跑一个任务,假如这个任务超时了就设置超时。在监听的过程中,有任务就执行,没任务就执行超时处理。


    图 8

    刚才的使用只是单次的话是没有问题的,但是在 for 循环里面会每次循环的话都会新建一个timer,这样的情况在要求性能比较高的场合,这是不可行的。有什么替代的方法呢?


    图 9

    图 10

    熟悉的小伙伴应该就会想到直接做一个 tick(图 9 ),自动给出消息,但是这个代码有一些问题,例如上面的代码,这个代码假如 1 秒之后没有了就超时。有个执行(图 10),如果你在这里可以直接刷新的话,这个超时的时候不会刷新的。

    图 11

    如果想超时也能刷新的话就需要做一些改造(图 11)。改造后就会刷新它,来的时候就会刷新超时,处理完了第一个,再处理完第二个,这样就可以解决 timer up 的问题。


    |goroutine 退出

    图 12

    第二个是 goroutine 的退出,大家可能有这种习惯就是每当起任务的时候都会起 goroutine ,这是不好的习惯。解决的办法是就是限定一定的 goroutine,限定 goroutine 的数量而防止流量暴涨的后续问题(图 12),这是比较好的方案。

    大家可以看一下 goroutine 退出的机制,每起一个 goroutine ,就起一个监听,退出的时候就等待 goroutine 退出,再结束。

    图 13

    这里有个问题,这种方式只适合 goroutine 一跑就结束的形式,并不能通过信号去让 goroutine 的退出。如果要通过信号控制 goroutine 的退出怎么办呢?需要有一个等待的函数(图 13),就是退出接受信号的函数。


    图 14

    具体是怎么实现的呢?如图 14 函数监听退出的信号,goroutine 接到信号就直接退出,在外面的时候就等待,整个退出机制就很完善了。

    图 15

    图 16

    但是以上情况是如果有一个信号退出的时候所有 goroutine 就会退出了,如果想实现链式的退出怎么办呢?就需要使用到信号传递了(图15)。可以这么做(图16),如图信号传递在第一个结束后再做传递,第二个监听完退出再传递,如此类推到所有退出完毕,就可以实现链式的有秩序退出。


    |语言的选择

    最后再来说一下为什么选择 Go 语言来做开发语言,总的来说可以总结为以下几点:

    • 简单、开发效率高

    • 部署简单,只需一个二进制文件,无依赖

    • 适合自己的才是最好的

    一是我们看中它容易学习,开发效率高,运营也不错。两个人在工作之余,相当于工作的 20% 的时间,团队一个月就弄了一个版本出来,我们觉得还不错。

    二是部署很简单,部署的时候就是二进制,很小没有依赖,服务器只要太老的系统部署十分简单轻便。

    最后一个就是适合自己的才是最好的, Go 语言对我们公司来讲实现的成本是最低的,是最适合我们的,在我们的眼里是最好的


    展开全文
  • 游戏中任务系统设计

    千次阅读 2019-10-31 21:27:46
    游戏中任务可以分为主线任务、支线任务、日常任务、周任务、节日活动任务,其中周任务和节日任务可以根据设定的日期进行开启关闭,属于重复性任务。 2、游戏条件 各类任务开启条件:1、玩家等级 2、玩家攻击力3...

    1、任务分类

             游戏中任务可以分为主线任务、支线任务、日常任务、周任务、节日活动任务,其中周任务和节日任务可以根据设定的日期进行开启关闭,属于重复性任务。

    2、游戏条件

            各类任务开启条件:1、玩家等级 2、玩家攻击力3、前置任务等等

            完成条件:玩家进行任务进度是否达成

            任务关闭:1、玩家领取奖励后关闭任务。2、时间过期

    3、任务逻辑类型:

          任务逻辑有多种,这个往往跟游戏内容相关,比如 杀怪、采集、聊天、升级、完成某家物品等等。每种任务逻辑配置成一张表,例如杀怪类,有任务id,场景(或副本)id,npc id等,这样执行任务判断时直接根据配置表进行判断,任务进行是否一致,然后进行任务进度计算。

          也有一些任务逻辑可以配置成脚本,程序根据脚本内容进行判断。

           简单任务逻辑处理方式(伪代码):

    void kill_boss()
    {
        //玩家杀死怪物
        TaskTrigger->updateTask(player,taskid, npcid);
    }
    
    
    class TaskLogic
    {
    public:
        virtual bool logic(tableElement *pelem, int n, ...) = 0; //tableElement代表策划配置表
    };
    
    class KillBossTaskLogic : public TaskLogic
    {
    public:
        bool logic(tableElement *pelem, int n, ...)
        {
            va_list arg;
            va_start(arg, n);
            int bossid = va_arg(arg, int);
            if (bossid == pelem->bossid)
            {
                return true;
            }
            va_end(arg);
            return false;
        }
    };
    
    class Task
    {
    
    public:
        //根据任务分类进行逻辑初始化
        void SetLogic(TaskLogic *pLogic);
        void updateTask(std::tuple& t)
        {
            if(pLogic->logic(t))
            {
                process+=1;
            }
        }
    
        int process; //进度计数
        int taskid;
        int tasktype;
        enum taskstate;
        TaskLogic* pLogic;
    };
    
    
    class TaskTrigger{
    
    public:
    
        void updateTask(player,taskid, npcid)
        {
            for(auto& it : mmTasks)
            {
                it.second->updateTask(npcid);
            }
        }
        
        void AddTask();
        void DelTask();
    
        std::map<taskid, task> mmTasks;
    };

    4、任务过程

          接收任务(将任务内容放到玩家身上)------->任务进行中(进行进度计数,也有一些直接判断完成任务例如聊天)-------->任务完成(根据配置逻辑判断任务是否完成)-------->任务奖励发放(玩家领取或者自动发放)------->领取新的任务。

    5、任务状态

          不可接任务、可接任务、任务进行中、任务完成(未领取奖励)、任务完成(领取奖励)

                     

     

    展开全文
  • Unity 实现任务系统 TaskSystem

    千次阅读 2018-05-09 11:08:22
    本帖最后由 martin4500 于 2018-5-9 09:57 编辑这段时间比较闲,所以抽时间写了游戏中常见的系统,任务系统,可以接受任务啊,然后通过刷怪等条件去触发任务条件,直到完成任务。这个系统相对来说比较的简单,可以...
  • 任务系统是每个游戏的标配,但是任务系统又是很复杂的,怎么实现一个任务系统呐。?
  • 轮询系统:即在裸机编程时,先初始化相关硬件,让主程序在一个死循环里面不断循环,顺序地处理各种事件。不能说轮询是低端的,轮询系统是一种非常简单的软件结构,但适用于仅需要顺序执行代码且不需要外部事件来驱动...
  • 如何设计一个分布式定时任务系统

    千次阅读 2019-06-04 14:34:00
    1、定时任务指定集群中的一台机器执行 2、如何修改cron参数,且修改永久有效 当然直接用quartz来实现肯定最棒,但设计的配置太多,小公司没那个需求; 关于第1个,我开始选择得做法是: 读取zk固定节点path的值...
  • 基于STM32的多任务系统内核--FSC_STOS代码解析

    千次阅读 多人点赞 2019-03-06 17:59:40
    FSC_STOS(点击下载@px86)是专为STM32芯片编写的多任务系统内核。 *任务之间相互独立,互不干扰。 *提供三种运行模式:时间轮询模式、纯优先级模式、时间片+优先级混合模式。 *采用时间切片轮询方式,每个任务运行...
  • 游戏中的任务系统的简单架构!

    万次阅读 2015-11-18 10:54:02
    之所以 想到先写这个“任务系统”是被面试到了!  废话不多少,上传不要代码! “任务”的五种状态 /** * 任务状态 * @author kevin chen * @Description: TODO * @date 2015年10月21日 下午8:20:39 */ ...
  • [Unity实战]一个简单的任务系统

    千次阅读 2018-05-30 16:49:54
    1.任务管理类与任务类是一对一的关系,而任务管理类与其他类是一对多的关系。对于一对多,比较容易想到的就是观察者模式了。在观察者模式中,是观察者决定要监视的东西,而不是事件的发生者决定谁观察它。2.对于任务...
  • 第四章:任务系统这部分主要对任务系统进行设计,游戏的关键因素之一就是任务系统与玩家的交互,但在代码实现中并不算复杂。本篇博客主要通过一下几个方面实现任务系统。任务模型的导入与任务UI界面的创建任务的接受...
  • go语言实现分布式crontab任务系统

    千次阅读 2019-04-08 11:56:29
    最近离职交接空档期,在慕课网上学习了下go语言实现分布式crontab任务调度系统。自己也跟随视频实现了一把(跟原版略有不同)。现把成果记录一下。 最终代码: https://github.com/funkol2007/distributed_crontab ...
  • unity3d 任务系统设计 mmo

    千次阅读 2014-11-13 23:46:08
    unity3d 任务系统设计 mmo  2013-08-23 13:09:12| 分类: unity3d | 标签:unity3d |举报|字号 订阅 最近一直在思考MMORPG的任务系统的设计。以下是需要达到的几个设计目标: 1. 任务逻辑...
  • [Unity实战]一个简单的任务系统(一)

    万次阅读 2015-05-16 12:10:59
    1.任务管理类与任务类是一对一的关系,而任务管理类与其他类是一对多的关系。对于一对多,比较容易想到的就是观察者模式了。在观察者模式中,是观察者决定要监视的东西,而不是事件的发生者决定谁观察它。 2.对于...
  • 前几天在windows server 2012上面设置一个计划任务来定时重启 tomcat ,重启脚本写好了,但是添加到计划任务后总是执行不成功,提示 “系统找不到指定文件。(0x...)”。 后来查了写资料终于搞定: 如果...
  • 所以我想发表一下我的个人看法 在我看来,windows7是多用户多任务操作系统。因为同一台电脑确实可以利用远程登录功能实现多个用户同时使用。你可以尝试一下使用QQ的这个远程协助功能。在别人协助帮你解决问题的同时...
  • Linux系统定时任务

    万次阅读 2018-08-24 16:55:42
    Linux系统定时任务 定时任务Crond Crond是linux系统中用来定期执行命令/脚本或指定程序任务的一种服务或软件,一般情况下,我们安装完Centos5/6 linux操作系统之后,默认便会启动Crond任务调度服务。 Crond服务...
  • 任务操作系统

    千次阅读 2019-10-27 12:06:08
    单用户单任务操作系统是指一台计算机同时只能有一个用户在使用,该用户一次只能提交一个作业,一个用户独自享用系统的全部硬件和软件资源。 多用户与多任务操作系统是指一台计算机可以同时有多个用户同时使用,并且...
  • 任务管理系统(PHP+MYSQL)

    热门讨论 2011-06-28 14:31:46
    很好用的项目管理工具,公司目前正用着他。
  • gocron - 定时任务管理系统 项目简介 使用Go语言开发的轻量级定时任务集中调度和管理系统, 用于替代Linux-crontab 查看文档 原有的延时任务拆分为独立项目延迟队列,小编的qq好友列表获取就是用这个做的定时任务...
  • 51单片机多任务操作系统的原理与实现

    千次阅读 多人点赞 2016-03-14 09:25:40
    想了很久,要不要写这篇文章?最后觉得对操作系统感兴趣的人还是很多,写吧....包括我在内的很多人都对51...但对于很多要求不高的系统来说,使用操作系统可以使代码变得更直观,易于维护,所以在51上仍有操作系统的生存机会.
  • 由于公司项目的需求,有时候需要更改系统时间,当把系统时间从当前(T1)往未来时间(T2)调整的话没什么问题,但是再从未来时间(T2)往回调整就会造成定时任务挂起的情况。网上也找了很多资料,但是没有什么合适的...
  • 任务分发系统-Qcmd-http详解

    千次阅读 2017-12-05 00:00:00
    女主宣言今天女主给大家带来的是360云平台的一项很重要的功能 —— Qcmd 任务分发系统。PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!Qcmd 是360云平台底层的命令执行系统,详细介绍...
  • 分布式任务调度系统选型

    千次阅读 2018-03-22 20:09:14
    分布式任务调度系统选型更多干货分布式实战(干货)spring cloud 实战(干货)mybatis 实战(干货)spring boot 实战(干货)React 入门实战(干货)构建中小型互联网企业架构(干货)python 学习持续更新分布式调度...
  • MMORPG开发杂谈(一):任务系统设计

    万次阅读 2006-07-11 11:27:00
    最近一直在思考MMORPG的任务系统的设计。以下是需要达到的几个设计目标:1. 任务逻辑与程序逻辑完全脱离;2. 服务器端程序和客户端程序提供有限的功能之后,可以由脚本程序员完成任务编写;3. 必须方便任务的更新...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,776,175
精华内容 710,470
关键字:

任务系统