僵尸银行家,Ragdolls以及从失败中学到的教训。
在这里免费获取。
好了,原型三已经制作完成了,老实说,感谢上帝。 这是关于动机艺术的一个非常有趣的课程,还有低估编程视频游戏AI复杂性的危险,我意识到这也是我最近来的博客文章,幸运的是,延迟的原因是我对第4号原型的兴奋之处确实很好。
因此,Break the Bank是一个简单的竞技场射击游戏,您可以用手枪射击僵尸,直到死亡或游戏崩溃。 如果僵尸碰到你,你就会死。 您可能会注意到,这与我几周前描述的概念完全不同。 事实证明,使用多支枪,基于物理和基于AI的敌人来构建合适的第一人称射击游戏是一项非常复杂,耗时的挑战,而我对此的概念并没有足够的动力。
从来没有,我对结果感到满意。 我在7月2日星期二将设计缩减到僵尸舞台上,并得以构建。 您杀死(重新杀死?)的每个僵尸都停留在关卡中,并且它们以相当有趣的方式堆积。 布娃娃效果很有趣,我非常喜欢最终使用的音乐。
编码
(同样,如果对编码游戏的技术细节不感兴趣,您可以跳到设计部分)
尽管游戏范围缩小了,但我还是设法向不断增长的脚本回购中添加了一些有趣的代码。 作为第一个包含AI角色的游戏,我不得不开始为NPC开发一系列的类。 目前,我对父NPC类和子ZombieBanker类使用简单继承。 NPC类中包含用于移动和死亡的代码(将来,对于敌人的朋友,我绝对会再次需要这些元素)。
ZombieBanker类包含此游戏中特定于僵尸角色的行为。 他们很简单。 产卵后,它们会找到玩家并不断向他们移动。 没有检测代码,他们会一直自动知道播放器在哪里。 为了走向玩家,我必须获取僵尸位置和玩家位置之间的差值向量并将其标准化。 这提供了玩家离开僵尸的方向,然后将其传递给move方法。
NPC类本身从我为Torch Lighter构建的ThirdPersonController中大量借用(是可重用的代码!)。 我所要做的就是交换读数,输入操纵杆/ WASD键,然后使用提供的Vector3进行移动。 这使我可以从Torch Lighter复制动画控制器,也节省了我一周的时间。 我要做的就是换掉走路和跑步的动画,改用Mixamo的基于僵尸的动画,瞧瞧成群结队的行尸走肉!

从编码的角度来看,唯一有趣的挑战是生成技术。 我有一个简单的要求:在一个随机的位置生成僵尸,并确保它们与玩家的距离大于x。 这里的解决方案没什么花哨的。 我创建了一个函数,该函数使用最小的Vector3和最大的Vector3(本质上定义了可以在其中生成对象的空间的长方体),然后为每个值的最小值和最大值之间的x,y和z值生成一个随机值。 然后,我检查了该点距播放器的距离,如果距离太近,则只需再次运行位置选择功能即可。 很快,而不是稍后,将选择一个适当的位置,该位置适当地远,然后可以在此处生成僵尸。
设计与建造
正如我在顶部所说的那样,很明显,这里的最终结果与我打算在两周开始时制作的游戏完全不同。 我的意图是建立一个非常简单的第一人称射击游戏级别,例如Goldeneye或Time Splitters。 现在回想起来,鉴于时间和我对AI和射击技师的编码经验,这似乎是一个崇高的目标。
我花了第一周的时间来尝试构建初始原型。 我添加了射线投射的子弹,可以击中屏幕正中央的任何地方。 然后我在那一点上产生了一个弹孔,很容易上手,看上去也不错。 然后,我玩弄物理学,让子弹在它们相撞的物体上施加力,这同样非常酷而且非常简单。
当我开始尝试添加敌人时,问题就开始了。 有人会说敌人是第一人称射击游戏的关键组成部分。 这些人是正确的。 可悲的是,他们上班很复杂。 根据编码部分,我修改了为Torch Lighter编写的代码,以处理敌人的移动和动画。 我很早就知道,我想在敌人死亡的那一刻对他们使用布娃娃物理。
对于那些不知道布娃娃物理的人来说,它们是当今游戏使用的更加逼真的复杂物理和动画的先驱。 我记得最早使用过的游戏是《杀手2:沉默刺客》,尽管我敢肯定这不是第一款游戏。 本质上,模型的各个部分(例如前臂,小腿等)都具有自己的RigidBody,因此可以自然地与环境碰撞。 每个RigidBody通过动画骨架使用的骨骼相互连接。 这提供了更逼真的死亡动画,并允许尸体在死亡后四处游荡(经常产生滑稽和病态的后果)。
Unity提供了一个很好的向导来创建布娃娃,只需要创建者从已使用的动画骨架中拖放各种骨骼即可。 然后,Unity生成每个RigidBodies,并将它们附加到相关的Game Object。 一旦模型上安装了布娃娃(对不起,Torch Lighter,您是唯一的一个),我添加了代码以检测子弹何时击中敌人,然后调用NPC.die方法。 此方法告诉游戏对象关闭“动画控制器”(可以为运行中的模型选择动画,无论它是运行,行走还是空闲),然后打开布娃娃。 同时,子弹会给布娃娃施加相当大的冲击力,制作有趣的死亡动画。

一切都很好,问题在于,实施一个动态的静态敌人,一旦被击中就做出反应,这使我花了近一个星期的时间。 这是疲惫不堪(火炬打火机需要大量工作才能完成)和对该概念缺乏兴趣的结合。 我发现过去几天没有完成任何工作,因此意识到如果我有机会按时完成比赛,就需要改变最终的游戏概念。
我决定和僵尸敌人一起去,因为他们所要做的只是冲向玩家。 在开发的最后两天,我添加了用于该基本行为和敌人生成的代码(请参见上面的编码部分),然后将其添加到我通常的菜单和游戏退出组件中。 这给了我一个非常基本的竞技场射击游戏,当我发布它时,我可以说我感到自豪(很多想法让菜单上说“骄傲”,但是我认为这可以卖出一些原型)短)。
我对游戏的视觉设计感到满意。 我使用了绿色雾效果,类似于用于Sunwalker Omega中水下部分的蓝色雾效果,该效果遮盖了从无处产生的僵尸。 我还使用了一个美妙的天空盒,在建造Torch Lighter时偶然发现了它,从而打造了一个非常绿色的Turok 64风格的竞技场。 最后,我将火把放在关卡的每个墙壁上,将回调链继续到以前的原型。
学习成果
那么,我从今年的第一次失败中学到了什么? 我认为关键词是激情。 为了在几个小时内完成某些工作,您需要对该项目充满热情。 我缺乏对“打破银行困境”的热情,这正说明了最终的比赛。 有一些我想制作的第一人称射击游戏,但显然不是。 我对游戏的初衷犹豫不决,并渴望与针对这些“邪恶”银行家的暴力观念保持距离。
我在业余时间制作这些游戏,但我没有太多。 晚上跑步后,我在工作日晚上有两个小时,可能是三个小时,而在周末则有24小时(假设我没有其他活动)。 如果我要为这些原型之一(50个以上的小时)投入合理的时间,我肯定会更好地对自己要制造的东西充满热情,否则动力就不会存在。
人工智能也大开眼界。 我可能已经编码了一个射击玩家的敌人。 但是,这比听起来要复杂得多。 完美的编程很简单。 我编写了一个AI,可以在10分钟内无故障地击中玩家。 困难在于要制造一种AI,当玩家值得被击中时,它就会击中玩家,这代表了您典型的可怜电影电影主持人。 然后,您需要代码来检测玩家,弄清楚他们是否在视线范围内,以及如果他们不在视线范围内,那么如何使他们在视线范围内(但只有在AI知道的情况下)。 如果没有更多的时间,那仅是两个星期的工作。
除此之外,我发现资产选择是一个问题。 我想建立一个近似银行的一半,但是我发现Unity商店中几乎没有合适的家具或装饰品(至少免费)。 我想如果要构建特定的位置(在我的新原型中再次遇到的问题),我将不得不尝试回到3D建模中,然后我需要开始平衡设计,编码,水平建设和资产创造。 我想这是一个有趣的挑战,如果没有其他要求(有人想为我做3D建模?您的报酬与我相同!)。
众所周知,这已经是一个有趣的两周了,我当然已经学到了很多关于自己的知识,我的动机,还有一些不错的NPC构建基块,这些无疑对将来的原型有用! 带来第四个原型!
小路很快乐,一路上我见。