【GlobalGamejam2020流水账】如何在48小时内做出一个生草的双人游戏


又到了一年一度的GGJ流水账时间(明明除了第一年,之后就没有过流水账了)。这次真的是非常的特殊,因为这可能是空前绝后的唯一一次线上GGJ。作为GGJ的官方,是希望游戏开发者在线下进行良好的交流沟通的,所以当我们知道今年的GGJ恰好是过年期间,深圳站可能因为无法安排线下场所举办,是蛮崩溃的。

但是很巧的是,因为新冠病毒,为了防止疫情扩散,GGJ特许了中国区进行线上举办。不能说是因祸得福,但是一切就是那么的巧合。得知这个消息之后,我就登上了GGJ的官网,对比了一下成都和上海两个站点,稍加思考之后,加入了成都站的群,开始了我的GGJ2020之旅。而此时距离GGJ2020开始只有几个小时。

先放一下这次的作品吧~

开题:Repiar,我真的在"修"数位板

GGJ2020主题视频

和往年一样,一段莫名其妙的视频之后公布了今年GGJ的主题:Repiar

v.
修理;修补;修缮;补救;纠正;弥补
n.
修理;修补;修缮

稍微翻译了一下是这个意思,因为没有纸和笔,只有数位板,打算把数位板接上电脑来脑暴的时候。发现,我的板子他不亮灯了!

没错,他坏了。明明几天前,我才用过。

然后我足足花了一个小时来修数位板,最后放弃,幸好板子还没过保修,我决定过几天等疫情缓解一些再寄修回去。但是没有板子怎么办呢,我去找垣儿商量了一下,美术问题就解决了,果然垣儿还是很可靠哈。这样下来也不是solo了,自己也没那么辛苦。

如果不能用板子,那我估计我就只能鼠绘了

放弃修板子之后,开始认真的想点子

上面这些都是废案,这个看起来很多颜色的矢量东西,我思考了挺久,最后也没想出合适的玩法。

然后灵光一现,在8:51分,主题公布差不多4个小时后,我做出了第一个GIF图

并且定下了一个初步的策划:

最终定下了现在这个,类分手厨房的横版双人合作游戏。但是定下来以后,我花了差不多一个小时(也洗了个澡),听着Bgm看这个Gif小男孩快速的抽搐。然后画了个万能修理机的示意图给垣儿

……大概能看懂画的啥吧

感觉这个游戏越来越清晰了。当晚做了个平台跳跃的最简玩法。

	void OnCollisionEnter2D(Collision2D col)
	{
		rig = col.gameObject.GetComponent<Rigidbody2D>();
		if (col.gameObject.tag == "ct")
		{
			if (rig.velocity.y>0) 
			{
				gameObject.GetComponent<BoxCollider2D>().isTrigger = true;
				col.gameObject.SendMessage("JumpAccess");
			}

		}
	}

	void OnCollisionExit2D(Collision2D col)
	{
		if (col.gameObject.tag == "ct")
		{
			gameObject.GetComponent<BoxCollider2D>().isTrigger = true;
			col.gameObject.SendMessage("JumpAccess");
		}
	}

	void OnTriggerEnter2D(Collider2D col)
	{
		rig = col.gameObject.GetComponent<Rigidbody2D>();
		if (col.gameObject.tag == "ct")
		{
			if (rig.velocity.y <=0){
				gameObject.GetComponent<BoxCollider2D>().isTrigger =false ;
				col.gameObject.SendMessage("JumpAccess");
			}
		}
	}

这一次首次利用了碰撞器和触发器的变换实现人物从下也能跳过平台。但结果他成了一个bug(之后再说)完成了最简玩法模型之后,就去睡了。

最草生的白上吹雪和凑阿夸,沉迷做纸娃娃完全忘记做核心功能

第二天我醒来之后做了啥玩意,我已经不知道了。我也不知道是吃了什么屎,利用主角的绑的骨骼动画,做了个凑阿夸。

然后我花了两个小时,用矢量图(就是瞎拉形状)的方式做了场景,还做了辆用骨骼动画动的汽车(太怪了!)

既然做了阿夸,我就又做了白上fubuki和心心的纸娃娃,做这玩意儿实在太有趣了(不是)

白上小猫咪

可以看到,我把坐车的系统也做好了,如果人物跳到车上,他就会变成一个触发器并取消重力随着车子移动,可以穿透别的障碍,直到跳下车或者撞上stop线。然后这个游戏就呈现出了一种生草的坐车效果……

到这里,都已经星期六下午将近4点了,我的核心功能还没开始做。花了大量时间在做这些纸娃娃和坐车功能上……

捡道具,对话:有点像个游戏了

在4点到下午7点这几个小时内,我做了些什么呢?

  • 箱子,在箱子可以触发获得箱子的道具,并触发箱子的动画
  • 路人,可以与路人对话,并触发动画
  • 车子,随机生成从左向右和从右向左移动的车子

这样看起来有些像一个正儿八经的游戏了,虽然这些都还不是核心功能,但是也是必要开发的模块。这种矢量图的画风配上动画的效果意外的很好。

10点钟的时候垣儿把画出来的修理机的素材给到了我,有好多元素,开始做了几个小时的动画。与此同时,我把修理机的代码基本上写了出来。

说白了就是用一万个if else判断背包里是什么东西然后触发什么任务。我将道具分成了三类。第一类是素材,编号为0-1000,第二类是从市民手中获得的坏的重要物品,编号为1001-2000,2001之后为修好的物品。原本我是将坏掉和修好的道具都划分为重要物品,结果发现修好的道具还能放进修理机里,于是重新编排了道具编号。

也完成了路人代码的编写,路人这边获取要修理的物品的机制和箱子是一样的,获取箱子后,路人会变成need状态,需要获取修好的物品然后进入消失状态。

修理机画完之后让垣儿画了一些坏掉和修好的道具。同时去做了双人机制。恰好有预留双人机制的位置,所以做起来很快。

ct1=GameObject.Find("ct1");			
ct2=GameObject.Find("ct2");
this.gameObject.transform.position=new Vector3(this.gameObject.transform.position.x+((ct2.gameObject.transform.position.x+ct1.gameObject.transform.position.x)/2-this.gameObject.transform.position.x)/10,this.gameObject.transform.position.y,this.gameObject.transform.position.z);
			
			float sizec=9+(Mathf.Abs(-ct1.gameObject.transform.position.x+ct2.gameObject.transform.position.x))/2;
			if(sizec>23){
				sizec=23;
			}
			this.gameObject.GetComponent<Camera>().orthographicSize=sizec;

这里是双人模式下的摄像机机制,会根据双人的坐标来缩放摄像机的size,其他的双人机制也就是把单人机制的代码复制粘贴一遍而已。

收尾:靓仔们我们CGJ2020见

剩下的就是关卡生成和UI了,因为时间的关系,而且星期六晚上(星期天凌晨)的状态其实比较差了,就决定只做一个关卡的demo,因为只有一个关卡,索性事件也不随机生成而是按照指定的顺序生成就行了。于是做好了定时机制,在什么事件内,让路人的预制体在规定的位置出现,并给路人赋值要修的物品,需要的物品,以及修理之前,之中,之后的对话。也做好了显示对话的机制。

完成之后就去休息了,游戏也做得七七八八了。

星期日早上做了最后的收尾,更换了物品的图片,修复了精灵图显示位置的错乱,制作了开始画面和死亡画面,最后就是修各种bug和打包上传游戏。

每次参加Gamejam都还挺辛苦的,虽然这次不是solo但是实际上也做了绝大多数的工作,这次开题开的比较大,要做的东西还挺多的,自己很久没写unity程序也不是这么熟练了。新的电脑里也没有以前的unity工程,导致想查以前做过的代码的时候只能通过博客里的少量代码和百度,花费了大量的时间。

最后放一下路演视频吧

至于最后的路演嘛,因为是个梗游戏,效果还不错,不过果然在生草排行榜上只能排第二。

为啥是第二呢?

因为上面这个,我实在自愧不如

以上,就是这次GGJ的流水账了。希望疫情快点过去,待到CGJ的时候,我们再在线下聚吧


想要成为自己的未来