|
NPC,英文None Player Character的简写,中文意思是“非玩家角色”,在游戏里面,就是由电脑控制的角色,从这个意义上来说,游戏里面所有非玩家控制的角色——包括所有的怪物——都是NPC。这是广义的NPC的解释。而现在大家对于NPC这个字的理解则倾向于狭义的理解:在游戏里面非怪物也非玩家的剧情或者服务性角色。通常这些角色负责起引导剧情以及一些服务性的作用。所以他们常常被认为在游戏里面是最没有用的一群,很少有人会花费大量的精力去对他们进行设计。而在许多韩国的网络游戏里面,由于没有剧情,所以没有剧情NPC,服务型的NPC像根木头一样傻傻的站着,只有你点中他的时候,才会弹出一个交易界面,给人感觉非常简陋而且不友好。——这也是韩国游戏被人诟病的地方之一。
我们这里要谈论的NPC是广义上的NPC,不仅仅包括剧情NPC、服务NPC,还包括那些怪物。
在游戏世界里面,这些NPC说什么话,做什么事情,都是由程序控制的,而这些NPC的行动规则,被我们称之为AI(人工智能)。一个游戏的AI制作得如何,在很大程度上决定了游戏的可玩性,也表明了游戏的设计者在游戏设计上面是否用心。
第一节游戏剧情设计
我们在前面谈到,在游戏里面,NPC很重要的一个作用就是引导剧情的发展,那么什么是游戏剧情呢?
什么是游戏剧情
我们看电影电视都看他所讲的故事到底如何,这个故事就是电影或者电视的剧情。同样的,游戏的剧情也就是游戏所讲述的故事。实际上,除了少量的极其简单的游戏(比如俄罗斯方块,挖地雷等)以外,大部分的游戏都做了剧情来吸引玩家,尤其是在单机游戏盛行的时代,对于游戏的剧情尤其重视,几乎所有的商业游戏,都有相当完备的剧情设计。在游戏大国日本,这种情况体现得更加突出。很多RPG都有非常完美的剧情,甚至在游戏里面探讨一些关于人生的问题——很多人被这些问题所感染,所同化。而更多的人被它的剧情感动。在网络游戏大行其道的今天,仍旧有很多人沉醉在单机游戏的世界里,剧情设计功不可没。
如同电影的编剧,游戏也有剧情设计师。剧情设计师也是游戏策划的一种。在日本,游戏策划需要经过专业的学习和培训,而且被分为许多更加详细的工种。一个制作组往往多达数十上百人,而其中策划都有很多种,包括专门的角色设计师,剧情设计师,关卡设计师,服装设计师……等等,但是在国内,这些情况在一般的公司是不可能出现的,国内的一个游戏制作组往往最大的规模也才十几号人。一个游戏组里面有两到三个策划已经算是很多的了,在很多情况下往往只有一个策划或者根本没有专业策划,所以根本不可能分得更加专业和细致,这决定了在国内做一个游戏策划需要做更多的工作,这些工作包括了游戏的总体设计,角色设计,剧情设计,关卡设计……以及这些设计的所有相关的文档,都需要策划来做。当然,我们这里不是讨论策划需要做什么,我们在讨论的是剧情。实际上,国内的这种情况导致了策划要做的事情太多,策划无法专心与游戏的某一方面的设计,对于任何一个方面都无法投入更多的精力——所以如果策划没有剧情设计的天赋,那么游戏的剧情自然不能做得很好了。
说到这里,我们不能不提一下曾经在国内大获成功的武侠RPG游戏《仙剑奇侠传》,遥想当年,有多少人就是为了它感人的剧情,不厌其烦的一遍遍把游戏打通关,把所有的分支剧情都找遍,想看看它到底有没有完美结局——毕竟,谁也不希望女主角就那么挂掉。结果是,没有。
如何设计剧情?
好的剧情是非常能够吸引玩家的。一个优秀的剧情往往是游戏的一大玩点。从这一点上来说,Blizzard简直是一个游戏史上的怪物。在他们宣称的RPG游戏《暗黑破坏神》里面,我们简直玩不到多少剧情,我们可以完全不必理会剧情而一路通关。但是众所周知,RPG游戏是最注重剧情设计的。但是同样在它的另外的游戏——那种完全不是以剧情取胜的游戏上,我们却看到了不可多得的,甚至很多RPG游戏都难以比拟的游戏剧情,这就是他所制作的即时战略游戏《星际争霸》以及任务版《母巢之战》,以及另外的一款即时战略游戏《魔兽争霸3》以及任务版《冰封王座》。同样众所周知,很多玩即时战略游戏的玩家想要玩的,并非是它的剧情,而是它的战略性。但是在这几款游戏,令很多玩家非常愿意去反复的玩它的任务关卡,去体会它的优美剧情——这又是哪些其余的即时战略游戏所能比拟的呢?相比之下,国内制作的很多RPG游戏的剧情都让人觉得厌烦。比如《剑侠情缘》(一代)里面人为设置的多结局,令人很提不起胃口来。这又是什么原因造成的呢?
我们知道,小说/电影/电视的好看与否,一方面处决于它的剧情是否精彩,另外一方面处决于它的人物设计是否被认可。而这两者之中,剧情倒在其次,人物才是最重要的。曾经有著名的小说家认为:“写小说就是刻画人物。”此言不假。很多人都喜欢看电影,尤其是美国大片,比如说《泰坦尼克》。论情节,《泰坦尼克》的情节并不复杂,但是却很成功,为什么?因为它的人物刻画得非常成功。它里面的每一个人物都刻画得有血有肉,栩栩如生,令人对他们产生了非常强烈的认同感,而在这样一个注定了是悲剧性的结尾的情况下,他们的所作所为更容易引起人们的共鸣。
实际上,游戏的情节设计也是这样。如果没有细致生动的人物形象设计,只有一个庞大复杂跌宕起伏空前绝后令人拍案叫绝惊艳的生动剧情——请原谅我用这么多形容词,因为这是很多游戏、电视、电影的广告里面常用的——试想,玩家对于游戏的人物没有产生认同感,那么他就会对游戏的角色漠不关心,这样一个生搬硬套造出来的人物——一看就是假的,我又何必去关心他的经历经验结果如何呢?结果令策划挖空心思想出来的剧情完全成了摆设而落空。
很多策划在刚开始设计游戏剧情的时候,常常会落到这样的情况下:我一定要想出一个新奇的,别人没有想到的,峰回路转的剧情设计,就像古龙老先生做的那样,让人不得不拍案惊奇。于是绞尽脑汁去设计所谓的剧情,反而忽略了人物的设计,导致所谓庞大复杂的剧情在玩家眼里根本不值一提。
这里又要重新提一下第二章结尾的那个故事,那个文学家痛哭小说中的人物的故事。实际上,当一个角色被赋予了相应的性格之后,那么他做的事情,都会按照他的性格去发展,而不是剧情设计师硬加在他身上的——角色的性格特征,本身在推动着情节的发展,而不是,我们硬把相应的剧情套在角色的身上——正如,在小说《三国演义》里面,你不可能指望张飞在受了督邮的气之后,好酒好肉的去请那个督邮吃饭喝酒搞好关系,然后暗地里用计策去害他——因为他的性格决定了他不可能那样做,如果在对应的游戏里面策划硬要让张飞那样做而不是去暴打那个督邮一顿——那样同样只能导致玩家的一句评语:“好假啊!”
不过另一方面,这样的设计常常容易导致我们无法控制剧情的发展,到最后只能导致剧情的失控,作为剧情策划,这样的结果常常是工作量被无限的放大,让我们对项目变得不可控制。毕竟我们不是专业的作家,我们制做的也不是艺术品,而是一件商品,作为商品,就有必要去迎合大众的口味,我们没有必要对人物进行那么深刻的刻画——殊不闻“曲高和寡”乎?实际上,过于深刻真实地刻画往往很难被主流玩家所能理解,从而失去了它所吸引人的地方。实际上,现在国内的游戏策划大都非常年轻,大多数才刚刚二十出头,无论是剧作经验还是人生阅历也都不足以刻画出那么深刻的人性和引人入胜的剧情。在很多时候,剧情和角色两者是相辅相成的,如果我们在剧情和人物上做一些变通,有些地方人物适应剧情,有些地方剧情适应人物——对于玩家来说,只要他们不是觉得特别离谱,他们就会接受。更何况,游戏本来就是虚拟的呢?
游戏的剧情设计有一个不同于小说或者电视连续剧的,那就是剧情的完整性。游戏的开发周期通常都比较长,如果采用连续剧的形式想把游戏剧情分为几集,每集都是不完整的,这种方式对于市场来说,并不可取。对于单机游戏来说,每个游戏的市场生命周期往往只有几个月到半年左右,而对于玩家来说,半年的时间足够让他们换上好几个游戏了。如果我们用连续剧的形式推出游戏的话,那么当游戏的第二集出来的时候,玩家往往已经忘记了第一集的内容。所以对于游戏来说,就算是一开始就打算作续集的游戏,也要保证游戏每一集的剧情的完整性——否则玩家玩到一个剧情不完整的游戏,只会认为制作公司为了挣钱把没有开发完成的游戏拿出来卖,对这个游戏就形成了不好的印象,这样即使游戏出了续集,玩过上一集游戏的玩家也不会买账。如果真的想做成连续剧,那么做成系列片的形式会好得多。
第二节 游戏任务设计
对于小说、电视、电影来说,他们的剧情是通过一个个的情节来体现的;那么在游戏里面,游戏的剧情是通过什么体现的呢?这就是我们将要讨论的问题,游戏的任务与关卡。
任务、关卡与剧情的关系
严格说起来,任务与关卡在游戏里面都是指的同一种东西,不过在不同类型的游戏里面对他的称呼不同罢了,或者称之为情节也是可以的。
在通常的RPG里面,这些情节或者被称为任务,或者被称为情节,而在即时战略或者格斗、射击、竞技等类型的游戏里面,就有可能被称为关卡。不过通常说起来,关卡一般是指大的、阶段性的情节段落,而任务则往往细小得多。比如在《暗黑破坏神2》里面,每一幕都可以被看作是一个关卡,而在每个关卡里面,则包含了或多或少的小任务。在不同的游戏里面,对于关卡的称呼也不尽相同,比如很多游戏喜欢把游戏做成章节形式的,比如《博德之门》里面就是分为“Chapter 1、2、3、4……”
在游戏里面,剧情是通过关卡和任务来具体表现的。如果说,关卡体现了剧情的节奏,那么任务就是剧情的情节的具体表现。
游戏的任务可以分为两种,一种是主线任务,一种是支线任务。主线任务承载着完成剧情的使命,通常是有自身固定的发展路线,玩家必须完成某某事件找到某某物品才能触发这些剧情。这些任务是单一的而且固定的,虽然某些游戏设计了分支剧情导向不同的结局——但这并不妨碍它的单一性。在某些剧情比较隐蔽的游戏里面或者对于某些没有游戏经验的玩家来说,往往会在主线剧情上卡住而动弹不得。支线任务对于游戏的剧情来说通常并不是很重要的,它跟游戏的剧情并没有直接的关联,不完成它也不会对主线任务产生明显的影响。但是并不是说,它在游戏里面的地位就不重要。和想象的相反,支线任务在游戏里面的重要性跟主线任务可以说不相上下。跟小说不同,小说在必要的情况下可以只有主线情节而没有支线情节,游戏则很少出现这种情况。在游戏设计当中,游戏的支线情节,或者说支线任务往往是游戏中的一大玩点所在。
前面已经说过,由于主线任务的单一性和次序性,玩家往往必须先完成什么什么才能继续做什么什么——这很容易导致玩家在游戏里面卡住无法前进。玩家在长时间的、枯燥的探索无果的情况下容易产生烦躁不安的心理,甚而至于进一步对于能否完成游戏失去信心,这个时候如果在游戏里面适当的安排一些不重要的,跟游戏主线任务无关或者有关的支线任务,让玩家在一边寻找主线任务的解决方法的情况下,一边完成这些支线任务,并且取得相应的奖励,那么对于玩家来说,这些支线任务所带来的奖励以及完成任务的小小成就感,使的玩家不再觉得探索那个难以揭开的主线任务的线索是一件枯燥无味的事情。而小说或者电影、电视不同——即使你不能理解剧情为什么会这样发展,但是只要你继续看下去,它就不会卡在那里不能动弹。当然,为了安排小说/电影/电视的续集或者外篇,他们也可能会有意无意的安排一些支线情节来暗示一下——这种情节安排的技巧我们在游戏里面也同样用得上,假如你策划的游戏有诸如续集、任务版、扩充版、外传之类的话。
关卡设计
如同前面说的,关卡主要掌握着游戏的故事情节发展的节奏。“文似看山不喜平”,如果小说的剧情平平淡淡,没有启承转折,没有前因后果,没有跌宕起伏,估计没有几个人会看得下去的。有一个词专门形容这一类的文章,叫做“流水帐”,通常都是“我今天早上七点钟起床,花了五分钟穿衣服,两分钟上厕所,然后十分钟洗脸嗽口,二十分钟吃早餐,然后就背着书包上学去了,路上花了十分钟……”想来没有谁会愿意对这样的文章多看一眼吧?同样,游戏的剧情安排也是这样,如果一路直线发展下去,那基本上就让玩家失去了对于探索剧情的兴趣。假如这种事情发生在战略游戏上面,那问题还不大,因为毕竟战略游戏不是以剧情取胜的,大家专注的是如何在战略游戏里面一关关的取胜,而不是关心他的剧情如何。但是假如发生在一款RPG游戏上面,基本上我们就可以说,这款游戏毁了。所以如何安排游戏的关卡是一件很重要的事情。
在关卡的设计上,我们可以参考很多成功的游戏的安排。如《星际争霸》、《魔兽争霸3冰封王座》的关卡设计,如果我们把每个种族的战役看作是一个关卡的话,就会发现这些关卡的安排非常有讲究和规律。他们并不是均匀的,有些详细,有些简略,而在每个关卡的最后,或平淡,或小高潮,总之不会让玩家觉得枯燥,而所有的这些铺垫,都是为了通向游戏最后的决战。
当然,关卡也可以采用均衡的平均设计,如果你对剧情的控制能力够好的话,也可以取得相当不错的效果。比如《魔法门——英雄无敌四》的剧情安排,在前五个剧情里面,游戏设计者为每个种族都安排了一场战役,让玩家培养出五个强力的英雄出来,而在最后一个战役里面,玩家却只能选择一个英雄来完成战役,而玩家所要面对的敌人,正是玩家自己培养出的英雄!这个出乎意料的战役,让前面五个平均设计的剧情都有了合理的解释,并且把情节引向了高潮!
突然想到文艺复兴时期有一位著名的音乐家所创作的《惊诧进行曲》。在第一次演奏给那些贵族们听的时候,交响曲的前半段平平淡淡,让人听得昏昏欲睡,索然无味,甚而至于连乐曲也渐渐沉寂——然而在听众就快要睡着的时候,交响曲突然毫无预兆的演绎了激烈的强音,令所有的人顿时精神大振,大感刺激,于是此曲被定名为《惊诧进行曲》。如今这种技巧已经被广泛的应用到各种流行音乐上面,大家已经不再觉得新鲜。
其实做游戏的关卡设计,也可以借鉴这些相关的设计经验和技巧的。
任务设计
相比与关卡设计来说,游戏的任务设计更加耗费脑力心力和工作量。如果说关卡设计是游戏剧情设计的战略层面,那么任务设计就是游戏的战术层面,需要综合考虑的因素很多,而且很多设计相当琐碎。我们常见到在RPG游戏里面,一个任务往往需要东奔西跑,找不同的人拿不同的东西,一层层抽丝剥茧才能解开一个任务,或者常常一个NPC给的任务往往不止一个,这些任务相互交错,相互关联,令人头疼不已——当然,一旦完成任务,所获得的成就感也是相当大的——这些任务,光是做起来就已经很麻烦了,那么设计起来呢?
其实任务设计,通常注意三个方面就可以了。任务在整个游戏里面的定位,任务的难度以及任务的复杂度。
任务的定位通常决定了任务设计的细节。任务在游戏中是主线任务还是支线任务?如果是主线任务,那么玩家需要多长的时间来完成这个任务,如何通过情节设计来达到这个时间标准?任务相关的道具应该如何搜集和使用?相应的任务提示应该安排在什么地方?
如果是支线任务的话,那么这个任务是独立的小任务还是大的支线情节的子任务?应该完成一些什么事情,给予什么样的奖励,如何让玩家取得相当的成就感,是否要为后续的情节埋下伏笔?
任务的难度涉及到游戏平衡方面的内容。如何调整任务的难度不至于让玩家无论如何努力也无法达成任务或者太轻松就完成了任务以至于没有应有的成就感?同样,在设定任务的复杂度的时候,也应该注意这些问题。
这些都是策划应该头疼的问题。在任务设计的过程中,很多地方涉及到游戏的平衡性,而游戏的平衡,往往只有在游戏能够运行起来的测试阶段才能够根据测试结果做进一步的调整,先前设定的大体上的数据,都只能做一些参考而已。当然,越有经验的策划,做出来的游戏设定会越接近调整以后的数据——这需要经验的积累,并非是一蹴而就的事情。
第三节 NPC与人工智能
在前面,我们谈到了游戏的剧情设计和任务设计,那么,这些剧情、任务是通过什么样的形式来展现给我们的主角——玩家的呢?对了,这就是我们本节所要讨论的问题,NPC。
NPC的作用与设计
我们已经知道,NPC在游戏里面所起到的作用有三个:一,演绎剧情;二,服务玩家;三,玩家(主角)练功的对象。此外还有一个相对比较少用到的作用:辅助玩家。那么,根据NPC实际所起的作用,我们也把NPC分为四类,第一种是用来扮演剧情中的配角的,通常有自己的姓名、角色定位,还要描述大段的台词,甚至还有可能伴随玩家去完成剧情——这种NPC,也就是通常的狭义上的NPC;第二种NPC是为玩家服务的,比如杂货店老板啦,武器店老板啦,客栈老板啦,寄存店管理员啦,医生啦……之类的,他们的作用就是为玩家提供各种各样的服务,比如说销售各种武器防具,为玩家补充体力精力,或者我们可以统称他们为商人。第三种NPC则是专门用来玩家练功的对象,再RPG游戏里面往往被称之为“怪物”,而在战略游戏里面则常常被简单的称之为“电脑”,比如在玩《星际争霸》或者其他什么同类的游戏的时候,我们常常会听到这样的评价:“这个电脑好厉害!”“电脑造兵怎么可能这么快嘛,明显舞弊!”第四种就是辅助型NPC,通常比如说新手引导精灵,玩家的宠物,或者雇佣兵——比如暗黑破坏神2里面的雇佣兵——等等,因为用得比较少,所以属于非必须型的NPC。
在通常的RPG游戏里面,三类NPC都是不可或缺的,不过在网络游戏里面,尤其是韩国所制作的网络游戏里面,这一定律似乎被推翻了。韩国做的网络游戏通常都没有剧情,所以剧情NPC根本就没有存在的必要,我们在大部分的韩国网络游戏里面都只能见到两种NPC——服务型的NPC和怪物型的NPC——以我们的眼光看来,这样的游戏根本就是半成品,残缺的不完全的游戏。
剧情NPC的设计在游戏里面是非常重要的,从NPC在游戏里面的作用我们就可以看得出来。在游戏的剧情里面,NPC不仅仅是一个摆设,一个花瓶一样的东西——你可以想象,在一个故事里面,玩家做了主角,去完成这个故事,但是主角所碰到的所有的NPC都是木头一样的东西——当他做了什么事情,NPC不会给他任何一点特别的表示,所有的角色都是冷冰冰的——这样一个世界是多么的冷酷,那么,玩家是否还能继续提起兴趣玩下去呢?
我很欣赏欧美以及日本的游戏公司设计的游戏,那里面,NPC也是有感情,有属于自己的生活的。比如其中一个设计:某NPC有一头可爱的宠物小猪,他非常喜欢这头小猪。当你第一次跟这个NPC打交道的时候,他会很客气的对你。可是假如你如果不小心踢了他的小猪一脚,他就会对你很生气,如果你继续对他的小猪不礼貌,那个NPC可能就不会再理睬你了。而在《网络创世纪》(UO)里面,你有的时候在夜里会找不到裁缝店的老板——一个NPC,然后你去面包店,会很意外的发现,裁缝店的老板原来在这里,他坐在桌子前面吃面包呢!一边吃还一边跟面包店的老板闲聊:“这面包的味道不错!”NPC也会肚子饿了,会自己去买东西吃!这样的世界给人一种多么真实和温馨的感觉呀。作为一名玩家,如果生活在这样的游戏世界里,他会觉得这个游戏怎么样呢?
我们需要记住,NPC虽然在游戏的剧情里面是配角,可是他们也是游戏里面的人物,我们有义务赋予他们自己的生命。为此,我们需要给每个NPC设计他们自己的功能,作用,行为规范——只要你用心的去设计,那么当游戏运行起来的时候,你会发现,你所创造的这个世界,里面充满了活生生的人!这是一件多么有成就感的事情!
什么是游戏的人工智能
AI,artificial intelligence的简写,翻译成中文就是人工智能。在游戏里面,人工智能是指NPC在跟玩家互动的过程中所表现出来的智能。
我们在设计NPC的时候,会给NPC制定很多的行为规则,那么这些行为规则如何在游戏里面实现的呢?这就是我们所说的人工智能了。在游戏里面,人工智能其实就是把策划给NPC制定的行为规则用程序描述出来,然后赋予给对应的NPC,让NPC在跟玩家互动的时候按照策划预先设定的规则行动。从玩家的角度来看,就好像是NPC有了智能一样,而实际上呢,这种智能是游戏设计师预先设计好的——所以叫做人工智能,也就是AI。很多人对人工智能有所误解,认为只有那种非常复杂的、实现了智能对话、智能识别、自我学习、神经反应模拟……等等功能的程序才能称之为人工智能。实际上,那不过是人工智能的高级形式,而我们为NPC所赋予的,也是一种人工智能,只不过没有那么高级而已。
人工智能在游戏中的应用
我们为不同的NPC设计了不同的行为规则——当程序把这些行为规则都实现了之后,这些行为规则就变成了NPC的AI,那么,人工智能在游戏里面是如何起作用的呢?
首先,我们来看看我们通常意义上的NPC会如何行动。这里我们仍旧使用前面的那个例子:NPC的宠物小猪。我们给NPC定义一个宠物,并且给他设定一个对这个宠物的喜爱程度。当玩家对这只宠物小猪表现出不同的态度的时候,小猪会产生高兴、愤怒等等不同的情绪——而这种情绪通过NPC对小猪的喜爱度的加权衡量之后,NPC就会对玩家产生相应的情绪:如果玩家安抚娱乐小猪,小猪高兴,那么NPC对玩家的好感度增加,那么就会对玩家采取友善的态度。如果玩家欺负小猪,小猪愤怒,那么NPC对玩家就会产生厌恶的情绪——这自然表现在NPC对玩家的态度上,如果这种厌恶达到一定的程度,那么NPC就会对玩家不理不睬了。
对于服务型的NPC,我们有时候也会见到这种设定。比如说在网络游戏里面,不卖东西给红名的玩家。
对于怪物或者说敌对型的NPC,则有比较多的情况了。
在《M2神甲奇兵》里面,组队练级通常会有这样的情况:一个防高血多的战士冲上去引回来一大堆怪物NPC,然后绕着自己队伍里面的法师跑圈子,而那些怪物NPC就在战士后面紧追不舍得跟着绕圈子。队伍里面的法师则站在圈子的中间很安全的放魔法,直到把这一大堆怪物全部变成经验值,然后战士再次出去绕圈子……实际上,这种战术就是利用了游戏的AI设定来进行的。在这个游戏里面,给怪物定义的行为规则是:视野内有敌人(玩家)吗?有。列为目标,锁定攻击(由于攻击需要靠近玩家才能进行,而玩家一直在不停的跑,因此怪物就跟着玩家紧紧追赶了)。然后在追赶的过程中受到攻击之后,再判定一次:视野内锁定的目标消失了吗?没有。继续攻击。这样,即使怪物NPC受到来自其他玩家的攻击,也会不理不睬。所以法师可以很安全的站在圈子中间放魔法来大量杀伤怪物,不用担心会被怪物攻击。如果我们把怪物的行为规则重新修改一下,变成:视野内有敌人吗?有。攻击我了吗?有。目标:攻击我的玩家。那么这样一来,法师就不可能高枕无忧的站在圈子中间放魔法了——只要他放魔法,怪物立刻就会掉头攻击法师。
通常给怪物设定的AI模式或者说行为规则还有:敌人锁定型,怪物一旦锁定目标,只要目标没有消失,不管在不在视野范围内,都会穷追不舍;选定最弱型:这样的怪物总是攻击它的视野范围内最弱的敌人——这是一种很令喜欢组队带人的玩家头疼的AI设定,因为需要带的人肯定是队伍里面最弱的,结果一上来就受到怪物的攻击,很容易就挂了,自然就没有办法带人了……
前面说的都是比较简单直接的AI,很容易应付。如果想要给游戏增加难度,我们可以这样设定:视野内有敌人吗?有。我的实力能够应付吗?否。我周围有同伴吗?没有。那么寻找同伴并且向同伴靠拢。靠拢完毕后,“视野内有敌人吗?”有。能够应付吗?能。那么攻击。嘿嘿,这样的怪物NPC,想必玩家应付起来,又要头疼一些吧?
同样,在战斗中,可以设定怪物NPC的逃跑:生命还剩下多少?二分之一。继续攻击。生命还剩下多少?四分之一。逃跑……当然,我们可以设定得更加聪明一些:生命还剩下多少?四分之一。要逃跑吗?再次判定:敌人生命还剩下多少?二分之一?逃跑。(或者:再次判定:敌人生命还剩下多少?五分之一?那么继续攻击。哇哈哈哈……,现在要逃跑或者加血的恐怕是玩家了吧?)
前面讨论的都是一些比较简单的个体AI的设定。实际上,在很多游戏中还要设定NPC的群体AI,比如在《魔兽争霸3》里面,要设定电脑采取什么样的战术,采用什么样的建造次序,出什么样的兵种组合进行怎样的战术搭配……这里面的人工智能设计就远远不是前面讨论的个体AI那么简单了。如果需要做这方面的AI,可以专门对此进行深入地研究,这里就不多做讨论了。
总而言之,我们在设定NPC的行为规则的时候,需要尽可能的用最直接最简单的方式描述出NPC最大的行为特征来。为什么?因为每个NPC的处理和运算都是要消耗CPU的处理时间的,如果每个NPC的行为规则都很复杂,那么电脑在一定的时间内(比如说一分钟)能够同时处理的NPC的AI数量就会减少。在单机游戏里面这也许不是一个很严重的问题,毕竟单机游戏里面最多也不过同时运算几十或者几百个AI,但是在网络游戏里面,就要同时处理几乎所有的NPC的AI,这对于服务器来说,是个严重的考验。而且AI描述也是用程序来描述的。越复杂的AI,描述所用的程序越多,也就越容易出BUG,调试起来越困难,这是所有的制作人员都不愿意见到的。
第四节 游戏脚本语言
什么是游戏脚本语言?
简单说起来,游戏脚本语言是游戏策划用来描述游戏规则的一种高级编程语言。对于不同的游戏来说,游戏脚本语言的形式都各不相同。游戏脚本语言有下列几大特征:
1、游戏脚本语言是一种高级语言。
游戏脚本语言是策划使用的,相对于专业的程序员来说,游戏策划对于程序编制非常生疏,因此作为一种能够让游戏策划理解并且拿来编写游戏规则的语言要求相当易于使用。
2、游戏脚本语言是特定的游戏专用的语言。
对于不同的游戏来说,其规则的描述都不尽相同,因此对于每个游戏而言,如果存在用来描述游戏的游戏脚本语言的话,由于受到游戏的需求不同,引擎的功能不同,那么它们对应的游戏脚本语言的功能、实现方法以及语法、关键字、运算等等都有可能不相同。因此不同的游戏,其脚本语言有可能各不相同,相互之间是没有通用性的。不过对于采用同一程序引擎的游戏来说,脚本语言可能会有一致的地方,其原因在于程序引擎的一致性。
3、游戏脚本语言对于游戏来说并不是必需的。
对于比较简单的游戏或者程序比较强大的工作组来说,大部分的功能都可以不用专门去编写一个游戏脚本语言来实现,而直接依赖于程序的实现。因此对于不同的游戏来说,游戏脚本语言不一定是必需的。也就是说,并非所有的游戏都需要游戏脚本语言。
如何设计游戏脚本语言?
在通常情况下,游戏脚本语言并非单一的由策划或者程序来完成,实际上,大部分的游戏脚本语言都是由策划和程序一起来进行设计的。
首先,由策划根据做出的游戏研发计划,确定是否需要使用游戏脚本语言来实现游戏的某些功能。然后,策划根据游戏的策划方案来确定游戏脚本语言需要实现一些什么功能,再跟负责脚本语言设计工作的程序进行沟通,一起讨论游戏脚本语言功能的实现,确定游戏脚本语言的细节设计,包括变量规则、函数的定义、功能的实现以及关键字和语法。
在游戏脚本语言设计的过程中,需要遵循以下原则:
1.功能性
对于特定的游戏来说,其对于功能的需求都有可能不同的。比如说,在RPG游戏里面,就基本上不会用到框选多数单位,以及阵型编排、建筑物制造等在即时战略游戏里面才会用到的功能,相对来说,RPG游戏的事件触发、任务处理比即时战略游戏对这方面的要求要高一些。即时战略游戏很少会有很复杂的任务需求。
游戏脚本语言的设计应该能够满足游戏功能的需要。
2.易用性
游戏脚本语言的易用性包含两方面的含义。一方面是易于策划理解和使用;另外一方面是游戏脚本语言易于实现,易于修改,易于调试。
前面已经提到,游戏脚本语言主要是游戏策划用来描述游戏相关规则。对于游戏策划来说,他们很可能没有受过专门的程序编写训练,他们对于复杂的程序编制工作难以理解,因此对于他们来说,游戏脚本语言越接近自然语言,对于他们来说,就越容易使用。比如说在游戏脚本语言里面加入指针、内存地址、寄存器等等操作,对于策划来说,就很难明白这些操作的实际作用。
在程序编写的标准化流程中,程序员需要首先实现功能的描述,然后把这些功能用接近人类自然的语言翻译成文字的形式,然后进一步翻译成一种接近于编程语言的“伪代码”表示出来。对于大多数策划来说,“伪代码”接近于他们能够看得懂并且能够用来描述游戏规则的极限了。所以在设计游戏脚本语言的过程中,尽量使用接近自然的语言。其实世面上有些比较成功的脚本语言可以拿来作为参考,比如说JavaScript语言,或者Visual Basic这样的语言。虽然这些语言并非是专门为游戏编写的,但是作为一种成功的高级语言,这些语言都是容易使用,即使对于以前没有接触过程序编制的人来说,也不需要经过专门的学习或者只需要经过简单的学习就可以很方便的使用。
对于编写和使用上来说,现在的大多数脚本语言都支持解释执行,也就是说,程序编写者可以随时对脚本进行修改并且马上运行就能看到相应的结果,而不需要象C/C++语言那样需要经过编译才能运行。不过从另一方面来说,对于性能要求高的游戏,比如说三维游戏,如果使用一种解释性脚本语言就有可能对游戏的性能影响很大,在这种情况下,一种可以编译执行的游戏脚本语言是必需的。此外,从程序的安全性上来考虑,经过编译的游戏脚本比较难于被黑客破解。因此对于某些游戏来说,从性能和安全性上来考虑,可编译的游戏脚本语言是必需的。在此情况下,我们可以考虑让程序引擎同时支持编译型的脚本和解释性的脚本——在游戏的开发和调试阶段,使用解释性的脚本便于调试,而在游戏的发行阶段,则去掉对于解释型脚本的支持以获得比较高的性能和安全性。当然,这两种执行方式对于使用这种脚本语言编写程序的游戏策划来说,并没有实质性的影响——他始终只需要使用,而不用去管到底程序引擎是如何实现的。
3.专用性
对于不同的游戏,其功能需求都是不同的。因此而导致游戏使用的脚本语言的不同——这是很正常的事情。如同一把钥匙开一把锁,编写一种通用的游戏脚本语言就像万能钥匙一样不现实。即使是万能钥匙,根据其尺寸、大小、形状的不同也分为很多类别。实际上,作为一种语言,通用性越强,设计的时候需要考虑的问题就越多,设计起来的难度和复杂度也越高,在实际编写的过程中出BUG的可能性也越大,执行起来的效率也越低——计算机程序语言的发展很好地证明了这一点。汇编语言是专门针对某一CPU编写的,因此用它写出来的程序效率是最高的,而C语言由于具有了通用性,为了在不同的平台上能够安全的运行,它不得不在编译出来的程序中添加很多确保正确执行的代码,其结果是性能比汇编语言下降了很多——据说达到了40%之多。因此对于特定的游戏来说,设计一个专用的刚好能够实现所要求功能的游戏脚本语言是最适合的。
当然,假如我们希望能够把我们的游戏引擎——包括游戏脚本进行商品化,那么我们就有必要编写适当的通用化的游戏脚本语言——不过它同样不可能适用于所有的游戏,受到游戏引擎的限制,它最多适用于某种类型的游戏。
《参商》的OOP脚本语言
下面这个例子是我为《参商》设计的游戏脚本语言,采用比较流行的“面向对象”的概念,比较便于理解。
1.设计思路
《参商》的系统是一个典型的RPG世界系统架构,作为《参商》的脚本描述语言,主要需要实现两个方面的功能,一方面是能够用来描述世界、地图以及游戏中出现的任务系统,另一方面需要能够有效地描述角色的AI。在使用过程中,尽量不涉及到游戏的底层,比如说引擎的算法,寻址以及相关的操作。
2.功能实现
我们把《参商》的对象分为五个大类:地域对象(region),场景对象(map),图元对象(tile),角色对象(role),物品对象(item),建筑对象(building)。
其中地域(region)对象包含整个地域的描述。地域是由若干个场景组成的。场景包含地图(map)的描述,以及在场景内出现的所有物品:角色,物品,建筑,等等。地域对象维持一个大的数组,用来标志在其中的场景。此外,它还包括所有跟该地域相关的规则描述。图元(tile)对象是构成地图的最小单位,在通常情况下,策划是不会直接操作图元对象的。
角色(role)对象包含了玩家角色(PLAYER),剧情NPC(NPC),宠物(PET)以及怪物(MONSTER)。
物品包(item)含了所有的可消耗和不可消耗的物品,比如武器防具(WEAPON)、药物(MEDIC),也包含所有的资源(RESOURCE),以及特殊的道具(SPECIAL)。凡是玩家可以取得的事物都算作物品对象。
建筑物(building)是独立于场景的对象,可以在场景的任意地方兴建。基本上,《参商》的对象类型就这么多。
对于任意对象来说,有各种“方法”供它使用。这跟C++语言的类的概念是非常相似的。对于任意的对象,都有Create、Set、Get和Release方法。Create用来初始化对象的各种属性,Set用来设置对象,Get用来获取对象的值,Release是对象消失。下面这张表示例性质的列出了role对象的一些方法。
Role对象的方法:
方法说明
BOOL Create(int ROLE_CLASS_ID, int class, int sex, int age, int reserved1, int reserved2);创建一个指定类型的角色。ROLE_CLASS_ID是指定类型的角色ID,具体参见角色表;class表示角色的类别;sex是性别;age表示角色的年龄;后面两个是保留参数,置0即可。如果成功则返回TRUE,否则返回FALSE。
Void Set(string name, LPVOID *val);设置指定的参数值。name表示要设定的参数名称,val表示要设定的值。
LPVOID *Get(string name);获取制定参数的值。name表示要获得的参数名称,返回指向该参数的指针。
BOOL Release( );释放对象以及所占用的空间。成功返回TRUE。
ERR *Action(int ACTION, int object );角色行动,ACTION是动作ID,从指定的动作列表中获取具体的动作,object是动作对象。例如:Alice.Action(JOINTEAM, Team_133);就是Alice加入一个名字时Team_133的队伍。返回值是保存错误信息的结构指针,如果成功则返回TRUE,信息为空。失败则返回FALSE,信息则是错误原因,比如“队伍已满”。
VOID Say(string val, int emotion);角色说话,val表示要说的话语,emotion是角色说话时候伴随的表情,为0表示使用默认表情。比如:Alice.Say(“Hello, world!”, SMILE);
............
此外,由于需要用来描述事件,以及AI描述,因此该语言需要相关的运算、判断、分支和转移等等相关的支持。这些内容包括for、while、if、then、else、switch、case、break、function、return等等,以及各种运算符号。
3.任务设计实例
我们这里给出一个简单的例子,小村里的一个铁匠雷,在见到一个玩家之后,决定把任务交给玩家去做。
map YunMengCun; // 定义一个名位YunMengCun的村子。
role LeiTiejiang; // 雷铁匠。
role Player; // 玩家。
LeiTiejiang.Create(TANGREN, MID, MAN, 0, 0); // 雷铁匠是一个中年男性唐人。
// ......
// 以下初始化过程略。
LeiTiejiang.Action(GetObject, Player); // 雷铁匠把目标定为玩家。
if (Player.Moral> 100) // 如果玩家的道德大于100
{
LeiTiejiang.Say(“......”, SMILE);
// 以下过程把任务交给玩家,略。
}
......
4.AI描述实例
我们这里做一个怪物的AI描述。我们假定这个怪物是一个狡猾的、欺软怕硬的角色。它见到比较强的敌人就躲,或者伙同其他的怪物来一起上,见到比较弱的敌人就打。我们假定这个怪物的等级是十五级。
我们先用“伪代码”来描述一下。
怪物•扫描。
有目标。
判断是否敌人?
是。(否则返回)。
(判断)敌人实力?
分支:
一个十三级敌人。
攻击。
分支:
一个二十级敌人。
附近有同伴吗?
没有则躲藏。
否则:判断同伴等级。如果是一个十五级以上则靠近,招呼同伴攻击,一个十五级以下则躲藏。
完毕。
下面我们把这段伪代码翻译成我们的脚本语言:
role Fox; // 我们假定这个怪物是狐狸
......
int function FoxActionAI( )
{
Fox.Action(Scan, ROUND); //察看周围。
if(Fox.scanround.numObject != 0) //如果周围的目标数不等于0
{
Fox.Action(GetObject, NEAREST); // 获取最近的目标。
if (*Fox.Action(Judge, Object) != EMENY) return; // 如果不是敌人就返回
int iJudgeMent = Fox.Action(Judge, LEVEL) ; // 判断对手实力
if(iJudgeMent < Fox.level) // 如果玩家等级高于狐狸的等级
{
int iFriend = 0, iEnemy = 0;
while (Fox.Action(Scan, ROUND)) // 察看周围并且统计敌友数量
{
if(Fox.Action(Judge, Object) == ENEMY) iEnemy ++;
else iFriend ++;
}
if(iEnemy < iFriend) // 如果敌人少朋友多
{
Fox.Action(Help, 0); // 发出求助信号
Fox.Action(Attack, 0); //攻击
}
else Fox.Action(Hiden, 0); //否则就躲起来。
}
else //如果玩家不到15级
Fox.Action(Attack, 0); // 攻击目标
}
return;
}
这样,我们就完成了一段关于Fox的AI描述。在最后,我们还要记得把这段AI指定给Fox这种怪物:
Fox.Set(ActionAI, FoxActionAI);
创造一个丰满的,人性化的AI是一件复杂、困难和非常耗费精力和时间的事情。对于策划来说,如果需要设计角色的AI,有必要掌握一些相关的程序知识,并且具备一定的程序编写能力。
|
|