达达尼昂 | 游戏开发[资料] | 2011-12-18
AI系统【转】

谈到人工智能(AI),这个话题就太大了;大学里有《人工智能教程》专门讲这方面的知识,什么大名鼎鼎的人工神经网络、遗传算法等等均可一窥究竟,这里如赘述似乎有些班门弄斧,我们暂且丢它一边去吧。

本节,我的主要目的是与大家共同探讨AI在RPG游戏中的应用。看过之前教程的朋友一定不会陌生,A*算法就是其中的一个重要组成部分;而本系列Demo中则使用了更为高级的改进型A*算法,不仅优化了性能,同时也大幅提升了玩家的操控体验。除此之外,AI更常见于RPG游戏中的角色,接下来我将引领大家循着AI的足迹,逐步探寻Silverlight网页游戏中的AI系统设计与Demo实现。

以一份网上见到的AI系统设计文档作为开始,我们不妨首先分析下它的主体思路,大可断定其为直观的解析当前国内即时类MMORPG主流角色AI设计:以古老而传统的有限状态机FSM(Finite State Machine)固定决策树AI为原型,简单而直接。当然,为了让游戏体验更加有趣且不至于显得一成不变,我会考虑引入基于Random的各类概率机制,即使用随机性和灵活性更强一些的模糊状态机FuSM(Fuzzy State Machine)。所有非控角色的行为完全无规律可循难道不会更吸引人吗?

有了大体思路后,接下来我们要做的就是将复杂而庞大的AI系统简化,使之更好理解并最终转化成Silverlight游戏程序代码。纵横剖析,我更青睐于按照策略AI (tactic)与行为AI (action)两部分予以划分。所谓“策略AI”即角色何时采取何种决策,而“行为AI”则为角色按决策执行何种行动。

基于以上方案,我首先在角色控件的内部添加一个计时器用于AI逻辑循环,其中策略AI间隔3秒执行一次,用于敌对角色的搜捕(索敌);行为AI与角色动作切帧率同步,根据实时情判断应该执行警戒/追击/攻击/转向/逃逸/或其他等行动;而这两种AI在角色控件中分别对应两个事件,对于主角来说,玩家的操作已相当于主角的策略,因此主角只需注册行为AI事件,而其他非控角色则需要同时兼具两者以具备完整的AI能力:

        /// <summary>
/// 动作(帧)切换时触发
/// </summary>
public event EventHandler ActionTrigger;/// <summary>
/// 以1秒为基础单位的时间间隔触发器
/// </summary>
public event EventHandler<IntervalTriggerArgs> IntervalTrigger;/// <summary>
/// 间隔触发器参数
/// </summary>
public class IntervalTriggerArgs : EventArgs {
public int Count { get; set; }
}

int tickCount = 0;
IntervalTriggerArgs intervalTriggerArgs = new IntervalTriggerArgs();
void intervalTrigger_Tick(object sender, EventArgs e) {
intervalTriggerArgs.Count = tickCount;
if (IntervalTrigger != null) { IntervalTrigger(this, intervalTriggerArgs); }
tickCount = tickCount == Int32.MaxValue ? 0 : tickCount + 1;
}


接下来又是一个难题,我们该如何编写这两类AI?困惑时不妨借鉴一下前辈们的经验,尝试回忆一下小时候玩过的那些RPG游戏:有的游戏喜欢以复杂程度来定义怪物的AI,打个比方:

简单AI:角色搜索目标 -> 攻击 -> 频死时回血、逃跑

中级AI:寻找最近目标 -> 攻击 -> 半血逃逸,呼叫同伴协助

高级AI:检索周围状况 -> 寻找最弱目标 -> 呼叫同伴,集体攻击

以上仅仅是一个粗略的AI流程图,然而却生动而有趣的比拟了目前网游大同小异的AI设计规律。或许其中的一些环节仍可被细分成若干枝节,同时有的还会根据游戏本身功能不断的进行拓展;万变不离其宗,性能与趣味性兼具的AI设计总是倍受玩家们迷恋。

又如《博德之门》、《冰风谷》等龙与地下城类型经典游戏,其中的角色在创建时会根据善恶与种族的选择决定性格,而性格往往就用于确定角色在游戏中的策略AI与行为AI。

到此,角色AI逻辑编写的切入点已清晰显露。综合以上所有,相信您的思维也一样会变得豁然开朗。接下来在本系列教程Demo的基础上进行代码编写便是非常轻松的事:

    /// <summary>
/// 策略AI
/// </summary>
public enum TacticAIs {
/// <summary>
/// 目标主角
/// </summary>
GoalLeader = 0,
/// <summary>
/// 自由战斗
/// </summary>
FreeFighting = 1,
/// <summary>
/// 小组作战
/// </summary>
TeamAttack = 2,
/// <summary>
/// 门派对阵
/// </summary>
MartialBattle = 3
}/// <summary>
/// 行为AI
/// </summary>
public enum ActionAIs {
/// <summary>
/// 简单
/// </summary>
Simple = 0,
/// <summary>
/// 机敏
/// </summary>
Alertness = 1,
/// <summary>
/// 固执
/// </summary>
Persistent = 2,
/// <summary>
/// 怯懦
/// </summary>
Cowardice = 3,
}/// <summary>
/// 角色策略判定
/// </summary>
void role_TacticDecide(object sender, IntervalTriggerArgs e) {
//每间隔3秒执行一次策略检索
if (e.Count % 3 == 0) {
RoleBase role = sender as RoleBase;
//异步判断角色是否处于屏幕显示区域中,是的话且无目标则进行索敌判断:在视线范围内则追击,否则警戒
this.Dispatcher.BeginInvoke(() => {
space.SetSpriteVisible(role, role.InSight(leader));
if (role.Target == null && role.IsVisible) {
bool targetFound = false;
switch (role.TacticAI) {
case TacticAIs.GoalLeader:
if (role.Target == null && role.IsVisible) {
if (role.IsHostileTo(leader) && leader.InCircle(role.Position, role.SightRange)) {
role.Target = leader;
targetFound = true;
}
}
break;
case TacticAIs.FreeFighting:
int count = 0;
int roleNum = space.AllRoles().Count;
while (count < roleNum) {
RoleBase target = space.AllRoles()[ObjectBase.RandomSeed.Next(roleNum)];
if (role.IsHostileTo(target) && target.InCircle(role.Position, role.SightRange)) {
role.Target = target;
targetFound = true;
break;
}
count++;
}
break;
case TacticAIs.TeamAttack:
for (int i = space.AllRoles().Count - 1; i >= 0; i--) {
RoleBase target = space.AllRoles()[i];
if (role.IsHostileTo(target) && target.InCircle(role.Position, role.SightRange)) {
role.Target = target;
targetFound = true;
break;
}
}
break;
case TacticAIs.MartialBattle:
count = 0;
roleNum = space.AllRoles().Count;
while (count < roleNum) {
RoleBase target = space.AllRoles()[ObjectBase.RandomSeed.Next(roleNum)];
if (role.IsHostileTo(target) && role.Profession != target.Profession && target.InCircle(role.Position, role.SightRange)) {
role.Target = target;
targetFound = true;
break;
}
count++;
}
break;
}
if (!targetFound) { role.Guard(role.Position); }
}
});
}
}

/// <summary>
/// 角色行为执行
/// </summary>
void role_ActionDecide(object sender, EventArgs e) {
RoleBase attacker = sender as RoleBase;
RoleBase target = attacker.Target;
if (attacker.IsHostileTo(target) && attacker.IsVisible) {
//怯懦行为简单表现为不主动追击,发现被攻击时立刻逃跑
if (target.ActionAI == ActionAIs.Cowardice) {
target.Target = null;
target.MoveTo(new Point(ObjectBase.RandomSeed.Next((int)(target.Position.X - target.SightRange), (int)(target.Position.X + target.SightRange)), ObjectBase.RandomSeed.Next((int)(target.Position.Y - target.SightRange), (int)(target.Position.Y + target.SightRange))));
}
if (target.InCircle(attacker.Position, attacker.AttackRange)) {
attacker.TurnTowardsTo(target.Position);
attacker.Attack();
//机智行为简单表现为受到攻击时会反击,受到两个以上敌人同时攻击时将会试图逃离现场
if (target != leader) {
if (target.ActionAI == ActionAIs.Alertness) {
if (target.Target != null) {
target.Target = null;
target.MoveTo(new Point(ObjectBase.RandomSeed.Next((int)(target.Position.X - attacker.SightRange), (int)(target.Position.X + attacker.SightRange)), ObjectBase.RandomSeed.Next((int)(target.Position.Y - attacker.SightRange), (int)(target.Position.Y + attacker.SightRange))));
} else {
target.Target = attacker;
}
}
}
} else if (target.InCircle(attacker.Position, attacker.SightRange) || attacker.ActionAI == ActionAIs.Persistent) {
//固执行为简单表现为抓住一个目标一直追击,直至自己或目标死亡为止
attacker.MoveTo(new Point(ObjectBase.RandomSeed.Next((int)(target.Position.X - attacker.AttackRange), (int)(target.Position.X + attacker.AttackRange)), ObjectBase.RandomSeed.Next((int)(target.Position.Y - attacker.AttackRange), (int)(target.Position.Y + attacker.AttackRange))));
} else {
attacker.Target = null;
attacker.Stop();
}
}
}


随手写下数十行代码,非常非常简单,外行人都能看得出不外乎if/else/switch/case/random,然而却实现了4种策略 + 4种行为,外带上角色职业与参数的不同将产生至少20多种不同的AI组合搭配,更重要的是非常易于新功能的拓展与维护。没错,Silverlight开发游戏就是这样简单~,让我们一同来领略下Silverlight为网游开发所带来的革命性奇迹吧(在线演示地址http://silverfuture.cn/)!

 

 

 

当然,这些所有的效果也仅仅算作是AI的入门;类似仿真技术的角色AI最早出现于欧美网游大作中,比如基于仇恨系统的角色索敌AI,经典代表作便是大家耳熟能详的《无尽的任务》(EQ)。这类游戏的AI系统设计通常以“仇恨值”最高的敌对阵营角色确定为攻击对象,所有角色的仇恨值都储存于一个动态表/库中随时检索。仇恨值的程度又与很多因素相关联,比如距离远近、等级差距、所剩生命值多少、是否在施展“嘲讽”等挑衅技能、当前行为状态(冥想/步行/跑动)、是否正在屠杀同族、时间流逝等等,且每个要素的权重值也不同,国内网游通常都喜欢将距离远近定为最高权重。当AI启动时会对同一区域内所有对象进行以上数据的统和,仇恨值得分最高的角色将被视为最有价值攻击对象,且仇恨值往往会被持续累积,直到角色死亡或施展特殊技能比如假死后方回到原点。当然,仇恨值的累积也并非都是简单的1+1,对同一怪物连续施展3次火球术将会彻底将其惹毛,没错,你太小看它了,它真的很生气;是的,游戏技术一直以来都在模仿真实的人类世界,试想下如果你被某人不小心踩上一脚相比被其连续踩上三脚我相信这样的愤怒不仅仅是简单的3倍加成吧?当你把生活中的类似环境置位到游戏中的角色AI时,你会觉得其实游戏设计原来是件多么有趣的事情。

追求高仿真虚拟现实的大型游戏甚至愿意花费超过20%的CPU以处理逼真的角色AI逻辑,其中往往包含着复杂的人工神经网络和遗传算法;当然对于更强调操控与实战效果的网游来说,AI不需要太复杂,但是性效比该如何取舍也必定是一个值得仔细斟酌考量的环节。Silverlight 5即将发布了~,带着超强大的功能与无限喜悦,我由衷期待!!

本节源码请到目录中下载

在线演示地址:http://silverfuture.cn

达达尼昂 | 杂七杂八【原创】 | 2011-11-17
三年

博客建站三周年整,入行两年有余,只觉才刚刚入门,需要学习的东西太多。

“知道自己不知道”——大概目前的一种状况,尽快升级吧…

 

写着写着就不知道东南西北了,delete,睡觉。

达达尼昂 | 游戏设计[资料] | 2011-11-07
Robo 5制作人访谈【推介】

按:《Robo 5》是一款近日在APP STORE上发行的动作益智类游戏,并收获了不少好评。游戏讲述了一个孤独、无助的小机器人如何逃出冰冷的实验室,并从中找到自我的故事。今天我们请来了执导《Robo 5》开发工作的徐步诣老师,让他来分享创造这款秀逸的IOS平台游戏的点点滴滴。

《Robo5

徐步诣老师曾先后在KONAMI上海分公司,皿鎏软件有限公司,上海火彩网络有限公司担任程序开发。参与制作了包括《幻想水浒传2》,《正当防卫》,《侠道金刚》等多款国内外大作。现创建宇果软件,专门从事移动平台的开发。其第一款作品《iGoBeat》已获10W下载量。

飞盒:首先我注意到你们对游戏的简介里用了一句尼采的名言:当你凝视深渊时,深渊也在凝视你。是不是它促成你构思游戏的创意?

 徐步诣:不是,只是我们的团队其中的一员比较喜欢这个名言,而且游戏中最后Robo5也是在宇宙中的,所以就采用了这个名言。游戏的创意主要还是来自于PS3上的一个游戏,叫凯瑟琳。

飞盒:嗯,我也注意到了,这款游戏与凯瑟琳很像,你觉得它们两者主要的区别是什么?

 徐步诣:游戏的整体风格和游戏的玩法吧。凯瑟琳除了核心玩法外,最主要的一个亮点是有点成人向的故事和描述,在关卡设计上也是采用了比较紧张刺激的方式。Robo5保留了核心玩法,但是在故事描述,场景感觉来说,更加的大众化,女孩子也能接受。而在关卡设计上,我们没有采用紧迫式的游戏方式,而是以思考解谜为主。

《凯瑟琳》

飞盒:也就是说,因为平台的不同,你们选择了更为舒缓和休闲的节奏。

 徐步诣:嗯,可以这么说,其实我们首要考虑的并不是平台本身,而是使用平台的人群。iOS平台和console最大的区别在于后者hardcore玩家多,而前者有大量的light user。另外我们做的最大的一个改动是把凯瑟琳的操作方式做了彻底的革新。从用摇杆的方式变成了完全触摸的方式 。

飞盒:因为我也玩过凯瑟琳,感觉你们的操作方式的转换很自然。

 徐步诣:这个我们可是花了大功夫的,前期用了一个月的时间做原型调整,在后期制作的过程中对按上去的时间,箱子的提示,箭头的提示全部做了微调。

飞盒:原来在玩家不会特地注意的部分才是最花功夫的,但大家玩的时候会感到很舒适。

徐步诣:嗯。不过还是没有做到最好,现在反馈下来老美的手太大,在iphone上还是容易误操作。

飞盒:在开发过程中,你们碰到的最困难的事是什么?是否让你们放弃了一些原先的构思?

徐步诣:其实开发过程中我们最困难的是觉得时间不够,因为小公司,预算有限,本来是计划4个月完成的项目拖到了6个月,因此我们放弃了很多本来想在游戏中加入的元素。比如开放编辑器,供玩家自己创建关卡;2人连线合作模式;更多种类的箱子等等。

《Robo5》游戏截图

飞盒:如果你想做第二部作品的话,会将这些内容重新考虑做进去么?

 徐步诣:嗯,我们有在考虑,更新版本的时候会陆续加入这些功能。

飞盒:为什么你会选择IOS平台,它相比其它移动平台有些什么优势?

徐步诣:其实我们是全平台的,现在手上也有windows, mac, web, 和android版本呢。

飞盒:你觉得目前手游市场的前景如何?

徐步诣:目前手游市场很火,而且以后会越来越火,但是对于小型游戏厂商来说,要怎么赚钱,还是一个需要摸索的过程。现在的手游市场和原来的pc市场非常像,特别是在ios这块。原来的pc市场一开始是单机,后面发展到网游,网游后面又有itemsales。目前iOS市场单机贡献的付费比例每年都在下降,而iap,sns这类的付费比例却越来越高。

飞盒:是因为移动网络越来越便捷么?

徐步诣:主要有两方面,一个是智能手机越来越强(机能),原来很多只能在电脑上做的事情,现在手机都可以做。第二个是网络环境,现在的无线接入速度越来越快,流量越来越大,但是价格却越来越便宜,按照这样的发展,以后在外永远在线不是问题。加上手机本身的便捷性,用户花在手机上的时间也会越来越多。

飞盒:也就是说,手游将会在未来成为主流。

徐步诣:应该说是两者并存,由于手机的便携性的需求,还不能达到pc的屏幕尺寸,另外操作方式上也有不同,这个是他和pc上在游戏制作上主要的不同,因此游戏的感受也会不同,不过可以肯定的是,用户在手机上的时间一定会越来越多,倒不是说会大量挤兑传统的桌面游戏时间,因为手机可以在碎片时间拿来用,原来等车坐地铁的时间,有可以手游,加起来还是和客观的。

飞盒:嗯,我想差不多了,最后请你向有志于开发手游的从业新人或学生说几句话吧。  

徐步诣:其实不论手游还是游戏,要做好游戏还是需要有一颗想做游戏的心,然后再结合手机的特点,(移动,碎片,网络)加上自己的想法和坚持,就能出好作品。

飞盒:谢谢徐老师接受这次采访。相信你的经验会给他们带来不少信心和期望。  

徐步诣:也谢谢飞盒游戏 :) 。

 

原文地址:http://www.freeboxgame.com/blog/?p=4436

达达尼昂 | 游戏设计【原创】 | 2011-06-08
五分钟不成功的产品研发经历

上回杭州游戏人高端沙龙讲座,五分钟在谈到其失败的研发经历时由于种种限制没有说清楚。
这次创业邦采访了五分钟CEO郜总,终于在这方便多说了一些,今天这篇文章当作上次的一个补充吧。
下面内容摘录自——创业邦:《开心农场》如何被超越
运营的同学肯定又要敏锐的指出这是《小小船长》的软文云云,不管这些,抠出自己认为还算有用的内容即可。:)

—————–华丽的分割线—————–

不成功的研发经历

  在《开心农场》之前,五分钟曾做过三款社交游戏,均以失败告终。2008年6月,五分钟开发出的第一款游戏叫《疯狂皇后》,是根据国际象棋改编的,尽管在大家看来这个游戏“很有趣、很刺激”,可登陆到社交平台后每天只有几百人来玩。为什么人这么少?郜韶飞总结的结论是:“人们不熟悉国际象棋的规则,这个游戏不够大众化。
<--达达尼昂:上次说到,SNS的基本特点是用户群广,轻度用户占绝大多数~–>

  总结第一款游戏的教训之后,他们很快又开发出一款叫《爱拼才会赢》的拼图游戏,这款游戏够简单,玩家容易上手,已经每天有几千人来玩。但问题又出现了,“我们发现它又长不大,不会再有更多人参与进来。”郜韶飞分析出的原因是:“虽然够大众化,但游戏对玩家在线时间要求非常高,必须得跟朋友同步在线,或者一玩就得玩半小时、一小时,而能够花这么多时间来玩游戏的人就不多。玩社交游戏的时间需要缩短,这是吃亏买来的第二个教训。
<--达达尼昂:异步交互,这个词现在不仅仅是对SNS游戏有效,对于webgame都有效~~网易蛮老的一款卡牌类游戏算是失败的例子吧,捆绑了玩家太多的时间(更重要的是垃圾时间),现在出的几款卡牌类SNS游戏都是采用异步交互的方式战斗,很符合当前流行趋势~~-->

  紧接着郜韶飞带领团队又开发出第三款游戏《赛车总动员》,这款产品又有新的发展,每天用户量上升到几万人,效果依然不尽如人意。这次的总结是:跟陌生人玩容易形成封闭的圈子,人们关注的重点在于你输我赢,却忽视了跟朋友间的情感交流
<--达达尼昂:SNS游戏,轻数值、重交互(Q宠大乐斗就是弱化了数值差异的典型),避免零和现象、鼓励双赢(开心城市避免了开心农场的“偷菜”单方面收益行为而改为“送货”双方都收益的行为)~~-->

  这次,郜韶飞放慢了脚步,有些游戏甚至已经开发到一半还是选择放弃。大概两个月时间,他们没再开发新游戏,而是用心琢磨社交游戏到底该怎么做。那个时候业内流行一个说法是“九天上线一个游戏”,即:三天策划、三天开发、三天测试,然后上线。
<--达达尼昂:尽快上线,根据用户数据反馈来调整设计,不要太爽,有木有?!-->

  “咱们不够标准,比他们用的时间稍长一点,但其实也很短。”前三款游戏压根没赚到钱,尚属纯投入阶段。据郜韶飞回忆,当时没有虚拟道具,一共就赚了几万块钱广告费。

  多次失败之后,感觉告诉郜韶飞《开心农场》这款游戏似乎有特别之处。“它足够大众化,人们没种过菜至少吃过菜;玩法的社交感觉更强,我种菜你也种菜,干旱、生虫时邻里间可以互相帮忙,朋友间的互动特自然,你根本就不用去设计。”《开心农场》投入市场后比想像中火爆很多,在人人网最高时达到400万的日登陆用户,安装用户达到几千万。

  完全摒弃了跟陌生人之间的互动,《开心农场》只跟好友互动。凭借这款游戏,人们的互动感就变得很强。“同学聚会,大家会聊起种菜;有些子女跟父母话题很少,玩了这款游戏之后,大家的共同话题多了起来……”
<--达达尼昂:SNS游戏促进线下互动的驱动力非常大,基于本身线下真实的关系,交互起来比传统MMO下线找不到人要好的多。(毕竟互留联系方式的hardcore玩家是少数)-->

  郜韶飞总结说,开心农场完美诠释了五分钟之前的产品理念。第一,足够大众化,没玩过游戏的玩家也能玩;第二,达到真实好友间的互动;第三,用碎片化的零散时间玩游戏。“五分钟这个词很有意思,它代表了一个不长不短的时间,以短时间为基础才能够实现前两条的游戏理念”,这也是公司取名为“五分钟”的缘由。

  2010年初,改进版的《开心农场2》变得复杂起来,在开心网发布时也能达到四五十万的日活跃用户,玩家体验也不错,但郜韶飞后来还是决定放弃对这款游戏的更新。《开心农场2》时,类似偷菜、养牧场、养鱼的社交游戏充斥着市场,这种“类农场”现场泛滥,用户早已经乏味。郜韶飞不得不承认,就产品本身来说相当棒。“当时添加了一些新功能,因为系统较为复杂,数值设计、系统设计做得不够精巧,有些高级玩家很快透知游戏玩法,再去玩就感觉没有劲儿,这样的话玩家就容易流失。我感觉是经验不足造成的,步子还是迈大了。”郜韶飞依然对这款产品不甚满意。

更多内容请访问:http://game.donews.com/industry/201106/494848.shtm

达达尼昂 | 游戏设计[资料] | 2011-06-07
动作冒险游戏关卡设计(三)【转】

[文章翻译来自Gamasutra,作者Toby Gard,原文这里,翻译Beret Ren  转载注明出处:kongberet.blog.163.com]

 

第三部分,作者描述了设计流程在游戏步调,结构和情感方面应该如何来综合考虑。

通过第二部分—利用故事创建关卡的过程,你基本上会得到纸上设计,故事,详细流程图,美术概念图,甚至初步的3D空间,这些都取决于团队想如何展现设计。这些关卡会以意想不到的方式成型,原先我们想象中应该是动作向的关卡,最后可能变成益智型,很多关卡会出现超出当前游戏机制的创意。

总体评估

要总体评估,创意负责人需要批准所有相关的关卡设计。因为关卡可能非常复杂,那么为整个游戏的所有设计建立单一的展现方式将非常有用,这样你才可以掌控游戏体验的步调和玩家情感的连贯性。

提取游戏机制

第一步要做的是确定所有关卡团队设计师提出的特殊的交互机制和创意,这些必然是游戏中最酷的部分:

KK从30层楼落下,要想生还他必须在空中干掉一堆僵尸以形成足够厚的肉垫。

这听起来相当不错,但战斗系统不能简单的与坠落融合而变成“坠落战斗系统”,所以关卡团队建议把它做成过场动画。

在一些其他的关卡里,KK必须破坏很多墙壁,关卡团队则必须提出很多不同的机制允许他这么做,比如触发一个便捷的,不稳定的重物来破坏墙壁。

很多类似的好主意都能做出精巧而独特的游戏机制从而把你的项目与别的区别开来。通过提升那些有足够弹性可以扩展成核心机制的创意,我们可以做出更加富有粘性的游戏体验。

比如,如何让破坏墙壁的机制变成可重复利用的呢?它需要某种消耗品吗?或者它是一个很容易使用的能力吗?不同的变种需要多少纹理呢?可以与其他玩家的能力配合使用吗?

我们这么做吧,把墙壁破坏机制与一种新幸存者的类型整合在一起,叫他炸药专家,他可以有很多不同的用法,但如果被僵尸攻击自身会爆炸—并杀死附近的一大堆幸存者。这是一种有趣的冒险/奖励机制,并通过一些标准的可以被炸的障碍/或敌人应用到不同的关卡中。

也许“坠落战斗机制”可以被应用在不同的关卡中,但它更像是一个迷你游戏而不是新游戏机制。尽管这个主意不错,但问题是你能让这个玩点产生3到4种“坠落战斗”变化以产生足够的深度吗?它相对于能获得的效果来说投资太大了。当然如果真的能做的,那也很酷。

这些机制都不错,因为他们从一个初步想法到最终确定并不是被勉强设计的,而是经过了对自身独特的题材和对游戏世界的深度探索后,原创形成的。一旦我们整合了这些新机制,就可以让角色更加适应这个被清晰定义的世界,并给关卡团队收集更多关键信息。

玩法类型

大部分游戏基本上都是某些元素的有机混合体。比如一个FPS游戏可能有70%的徒步射击和30%的驾驶射击。如果每个关卡中元素的混合比例都完全一样,那玩家很快就会疲劳。但如果游戏中有些关卡完全是徒步的,还有些关卡里有很棒的载具可以驾驶,那么这些内容就像调味品一样,不断的让游戏体验产生变化来满足玩家的新鲜感。

通过检查游戏过程中玩法的混合情况,你可以找出哪些地方游戏体验过于平淡。持续的保持玩家兴趣的典型游戏是半条命2,几乎所有的关卡都有一个中心主题,比如新武器,新载具或者新型敌人,你的体验每隔30分钟左右就会戏剧性的变化一次。

实例:功夫僵尸杀手

让我们根据我上一篇文章“评估游戏机制的深度”继续讨论下“功夫僵尸杀手”的深度问题。设计中游戏玩点的变化主要集中在幸存者的类型上。

医生:可以设计一个目标是治愈受伤幸存者的关卡

卡车司机:可以设计一个目标是运送一些重装备的关卡

工程师:可以设计一个具有传统经典益智元素的关卡

士兵:可以设计大部分过程由幸存者为你战斗的关卡。

等等

假设以下就是我们为关卡设计的一些场所:柔道训练馆,医院,建筑工地,军事基地,电力站,警察局,超市,市中心,大学校园,歌剧院,电视台,办公大楼。

从故事中我们得知游戏必须要从KK的柔道训练馆开始,在救了jenna126xyz后结束。

设计的目标是80%的战斗,20%的解密,细节请看下图:

但设计过程中又发生了两件事情(其实发生了一大堆事情,只是这里把他们简单化)

第一,有些人提出了另一种相当酷的幸存者,老师。他可以通过演讲把僵尸催眠,这引入了更多的解密元素,改变了大学里的玩法组合。第二,一些人提出将电影院变成电影拍摄基地,在那里僵尸和幸存者可以基于比如荒野的西部或者哥斯拉电影来设计。大家对这个创意以及由此产生的疯狂的机制非常兴奋,并决定把它分成两关。

结果整个设计看上去有点失去平衡,比原计划多了一个关卡:

我们找到了足够多的点子可以让每个关卡都多一个新的机制。通过裁掉超市,并把电站提前,我们调整出了拥有更好的游戏节奏的关卡:


这个图表依然有提升的空间,比如为市中心设计新的幸存者类型或者把它换成更富想象力的元素。

 

情绪线

游戏过程的背后,你肯定想要玩家产生某些情感。游戏主角可能经历比如无私的爱情,复仇,悲痛或生气等等。有些情感事件可能挺重要的,但都不如你想让玩家经历的整体情感基调重要。

情绪,就是能够传递给目标用户的基本情感,像恐慌,害怕,颤抖,敬畏以及兴奋等都是情绪,而像复仇,嫉妒或极端主义等高度概念化的情感则不是。

制作情绪线有两个目的。它不但用来评估关卡顺序和内容是否妨碍玩家的情感历程,而且更是用来保证整个开发团队创建统一游戏体验的关键工具。比如,让我们假设KK的故事这样发展:KK经过战斗终于到了救他爱人的那一刻,但他花的时间太长了以至于他的爱人被僵尸咬伤并变成了僵尸。

如果我这样定义情绪线:令人敬畏的打斗――滑稽的混乱――踏上成功之路――黑色幽默,则

·         美术会设计明亮的色调

·         动画倾向于高动作与残暴风格

·         音乐和音效倾向于快节奏与戏剧性

·         设计师在决定UI时越重口味越好

随着时间流逝,通过定义独特的情绪线你会更准确的引领整个团队,甚至超过你的想象。比如“踏上成功之路”暗示游戏更加艰巨。这就要求音乐更加激烈,关卡的结束动画更加残暴,类似的所有元素在每个关卡都要紧闭结合。

也许你会假定游戏的基调为“滑稽”,那么它渐渐的对整个游戏的开发又会产生戏剧性的影响。比如,如果我将游戏的情绪线定义成这样:惊慌――恐怖――越来越颤抖――悲剧,游戏的所有方面都会完全被它改变:

·         美术会创建黑暗肮脏的空间,用闪烁的光线和恼人的故事布置关卡

·         动画会倾向于现实并尽量避免搞笑的动作

·         音乐和音效听起来异常烦人

·         设计师会让UI和其他设计元素保持现实风格

就算游戏设计完全相同,两种不同的情绪线会产生完全不同的游戏体验。只要整个团队接受了这条情绪线并坚持不懈地应用在所有资源和创意设定中,既定的情绪就一定会慢慢传递到玩家身上。

通常会发生的是,每个团队成员对游戏要创造什么样的情绪线在理解上都稍微有些不同,以及游戏中玩家在哪个点要经历什么样的情感都有不同的主意。因开发团队不能达成共识而导致大部分游戏不能成功的打动玩家,这不足为奇。情绪线可以像上述4阶段过程一样简单,或者也可以非常详细,比如在每个关卡放置多个情绪模块。记住,不以故事为基础的游戏只有一种情绪。就算是恐怖游戏的情绪线也是在紧张与完全恐怖之间震荡。

一旦你确定了玩法布局和情绪线,就可以看出当前关卡之间是如何相互结合的。

在这个实例中我们在游戏结尾设计了解密元素,很明显这会降低游戏节奏,但在那里我们却希望玩家经历“踏上成功之路”这个情绪阶段,这完全不合适。通过重新整理关卡,或在关卡间互换玩点,我们可以更好的达到既定的情感目标。

幸运的是这个游戏的关卡顺序非常有弹性,但大部分游戏却不是。在大部分案例中要做到这一点的方法是,为每一个独立关卡的设计团队提供反馈,尽量达到预期的情绪和玩点组合。就算上述这个例子很可能没有最好的关卡顺序,或者甚至没有最好的情绪线,但这次练习的目的是尽量强迫自己检查整体规划,这样每个关卡在整个体验过程中的位置才会恰到好处。

块模型与原型(关卡编辑器中先用简单的方块模型制作原型)

下一步就是在3D环境中创建关卡了。如果你想要可信而有趣的空间的话,我要反对那种不要设计师,认为美术就是最好人选的做法。无论关卡能否像计划的那样适合技术和产品限制,要证明它是否足够精彩,使用块模型就可以了。因为这些关卡只是原型,与规划的相比肯定有些许不同之处,设计师会基于美术让它更适合设计图,所以在块模型和原型阶段,负责人必须持续更新游戏节奏图表,并让关卡适合情绪线的前后关系。通过在块模型阶段持续的产生新机制并保证关卡顺序可以重新排布,你就可以在不限制关卡建造者创意的情况下,继续获得平衡性更好的游戏设计。

总结

·         所有通过创建块模型而获得的信息应该可以让游戏设计更进一步。

·         最终的情绪线能够表达所有创建的资源。

·         新机制能够被定义并插进相关关卡中

·         关卡能够重新排序并产生预期的节奏和情绪

·         预算一定要管用

·         不好的关卡要被裁掉

·         玩家能力一定要做成原型才会被最终确定

一旦所有关卡都被制成原型并且有一个关卡作为标杆被精雕完毕,产品开发就有了牢固的基础。