
虽然说是个技术博客,但是用到的解决方法还蛮土的,毕竟自己Unity没学到家,程序也没专门训练过,不过能动就行了,要啥自行车,所以这次开发出来的作品还有一大堆bug……将就看看吧,欢迎各位提出宝贵意见!
这次LudumDare挑战做了个简单3D游戏参加Compo组(48小时组),本次的主题是Start with nothing,LudumDare的主题一向是对玩法有指导意义的主题,这种出题就非常有意思。
既然是Compo组,那当然程序美术音效音乐策划全是我自己,当然,音乐一如既往的一坨屎,不过相对于之前我的Compo组作品,这个相对来说复杂度高了许多。
概念设计
本来拿出板子想要练手画画的,可是接下来的概念设计可能是这次LD中,我画的唯一的图了


没错,上面这两张就是这个游戏的概念设计,虽然我现在也不知道是什么鬼东西,红色的大概是主角,走在会出现的不同颜色的格子上,然后怎么玩呢,就想到以前LD有人做的那个僵尸工作的游戏以任务为主导式的游戏玩法。
那么怎么去扣题呢,这里设计的是主角站在格子上,周围的格子就会不断地出现,不过考虑到我会使用效率非常低的GameObject.Find方法,还是考虑地图回收。总之,就这样的想法做出了最小可玩版本
开发过程
最小可玩版本
最小可玩版本的效果大概如图。

嗯,看起来还挺炫酷的。虽然就是个检测碰撞以后,检索碰撞的格子周边的格子是否存在,如果不存在就加载预制创建格子的过程,不过一动遮百丑这件事确实是真的,动起来就很好看了。
这里就真的采用了效果非常低非常蠢的GameObjectFind方法,我给每个实例化的预制体命名为fl(x,z),其中xz为坐标,然后去Find对应的格子。在创建格子之后考虑回收,格子生成的时候设定回收时间,如果达到规定时间,并和主角有一定距离,就可以进行格子的回收。
↑这里给后面的bug留下了不小的伏笔~
任务设计
总之看起来我可以开始做不同类型的格子了?
这个时候忽然想起,任务还没想呢!在此之前,任务系统仅存在于概念图里……那接着就来做任务设计吧!
根据主题, Start with nothing,想到以人生模拟器为主题的任务设置说不定会比较符合主题,比如小的时候找找奶瓶纸尿布,上学的时候交交作业,长大以后结婚养小孩,锻炼赚钱上班见客户,老的时候钓钓鱼去去医院之类的任务设计。我把任务分成了三类,FIND(寻找道具),SEND(送道具),GOTO(前往地点),每个任务有开始年龄和结束年龄

这样任务就设计完了,这里的想法是年龄(AGE数值)会随着时间发展不断地增加,生命极限(LIFE数值)随着完成任务进行增加,当AGE>LIFE游戏就会结束,最多能活到100岁。完成设计后对任务列表进行了英文化,毕竟是英文的游戏,各种工地英语+各种百度咕咕翻译完成了任务列表英文化。
特殊格子绘制
根据完成的任务设计列出地点列表以及该地点出现的时间,因为每个任务都有StartAge,也就是说,我在该地点最早的StartAge让地点格子轮流出现就行了,地点格子是不设置摧毁时间的,它会一直存活在场上。格子出现的办法采取先创建地点格子,然后创建格子的时候,由该地点格子向控制中心申请格子的地点。因为地点和道具都挺多的,所以具体的地点和道具都用3DTEXT来显示了(避免要画画),这样画面也很有风格特点了。

和地点出现类似,加入道具格子,道具格子就不需要申请了,可以随机产生,但是随机数生成模式需要根据AGE变化而变化(这个生成公式导致了早期游戏里会刷新出大量的瓶子和纸尿裤,这个瓶子实际上想说是奶瓶……可是当时怕写不下就直接写了瓶子,本质拾荒游戏石锤)
地点格子和道具格子碰撞后,会给主控中心的全局变量汇报地点/道具的编号,按J可以将道具捡起来放到任务栏,此时地点格子会变成普通格子。
这样游戏基本上能走了,但是我的电脑玩起来比较卡……电脑该换了,有点后悔做3D了。下一次Gamejam之前,我一定要把电脑先换掉。
任务列表
忽然想起一个问题,LudumDare因为需要试玩打分,我的游戏需要打包成WebGl格式,但是,网页版读取配置表会比较麻烦。我原本打算采用逗号分隔的Csv文件作为任务配置表,这样webgl可能就无法运行了!
于是这个作品最土的地方出现了,这一段是这么写的。
string LoadMission(){ //任务表 string MissionList=@" 0,3,FIND,0,0 0,3,FIND,1,0 1,6,FIND,2,0 3,8,SEND,2,1 3,8,SEND,2,2 4,10,FIND,3,0 4,12,SEND,2,3 5,100,FIND,4,0 5,15,SEND,5,2 6,20,GOTO,-1,1 7,20,SEND,6,1 7,20,SEND,7,1 7,100,GOTO,-1,2 8,70,GOTO,-1,4 10,35,SEND,8,3 10,20,FIND,7,0 10,50,GOTO,-1,5 10,50,SEND,9,3 10,20,SEND,6,1 10,35,SEND,8,2 10,50,FIND,10,0 10,100,GOTO,-1,6 13,100,SEND,11,7 13,45,SEND,10,8 15,100,SEND,12,2 15,80,SEND,13,4 15,20,SEND,14,1 20,80,SEND,13,9 20,80,GOTO,-1,9 20,25,SEND,9,10 20,25,GOTO,-1,10 25,35,SEND,1,2 25,35,SEND,0,2 25,50,SEND,15,4 25,60,GOTO,-1,11 25,60,SEND,16,11 30,100,GOTO,-1,6 35,60,GOTO,-1,12 35,55,SEND,15,7 35,40,SEND,5,2 35,70,GOTO,-1,13 40,100,SEND,17,2 20,50,FIND,13,0 40,60,SEND,18,14 40,60,GOTO,-1,14 50,100,GOTO,-1,6 50,100,FIND,19,15 60,100,GOTO,-1,6 60,100,GOTO,-1,6 70,100,GOTO,-1,6 80,100,GOTO,-1,6"; string [] MissionListSpr=MissionList.Split('\n'); int Mission=0; if(((int)CreateArea.age+1)*2<51){ Mission=Random.Range(1,((int)CreateArea.age+1)*2); }else{ Mission=Random.Range(1,51); } //Debug.Log("抽到了"+Mission); return MissionListSpr[Mission]; }
这TM是直接把逗号分隔的CSV直接怼到一个字符串里了emmmmm可是真的没更加简单粗暴又能解决问题的办法了……我们土味程序员是这样的……
这一段调了很久很久,无论是溢出还是抽出任务后是否符合年龄的循环都调试了很久,至今还有一些bug;因为道具和任务生成机制和公式的不完善导致了这个游戏的平衡性非常糟糕……
接下来的任务显示UI动效也特别土味,因为显示窗是在UGUI里的,不知道他具体的坐标,索性就在开始游戏的时候用变量记下来了,刷新任务的时候移动到记下来的位置
这样基本上就完成了
音乐音效
自己用水果瞎做,超难听,白学了几年钢琴。但是Compo赛制要求音乐也要自己做,没办法,只能瞎做,不能不做。
调试与bug解决
做到这里bug一堆堆,很多直到发布都还没解决!简单列一下吧
- 最大的问题:因为我的电脑性能以及载入机制的原因,出现了某些虽然命名是那个位置,但是实际上不在那个位置的格子!普通格子没什么,但是遇到地点特殊格子,会直接导致这个格子失效,任务无法完成……这里对移动系统和格子载入的坐标确认进行了一轮大改,移动变成了虚拟的棋盘移动,用移动的主角来判断生成格子的坐标,花掉了差不多半天的时间,修改之后,虽然还会有一部分重叠/失效问题,但是游戏基本能玩了
- 仍然是性能的原因,这个游戏在不同电脑上跑起来速率不一样,有的很快有的很慢,这里把有时间加减的Update都写入了FixedUpdate来保证各种不同机器运行效果接近。
- 任务列表载入会溢出,发现是不知道什么原因自己在有一个去医院的事件里把6写成了16导致溢出。但是至今在玩WebGl的时候可能还会载出Goto空任务,暂未查明原因,似乎玩PC版没遇到过这样的问题←查明了,复制粘贴以后写错了,导致第二个任务的goto全部有问题
- WebGl版任务列表显示不全,GOTO类任务向右符号无法显示,将任务的Text变成了Overflow模式,并且缩小了字体。向右符号改为右书名号
- 人物移动还是有可能掉下去,不知道为啥
总结
Unity3D,Unity3D,用了那么多年,实质上几乎是第一次做3D,之前LD43做的丢人小游戏那也是3D,可是那是JAM赛制,代码毕竟不是我写的
全是坑,还是得往里跳,只有在实践中才会去学东西
你看人物会掉下去的bug,现在不还没解决吗?
唉可是不试试怎么知道坑呢?希望之后还有很多机会做3D,当然,渲染管线什么的,在我的脑海里是不存在的,以后会不会能学会呢?不知道呢~
自己知识还是太匮乏不是科班出身经验也少,现在也没有做游戏有关的工作,全是爱好,能做出来已经不错了不是吗?那么Bug还修不修?估计不修了,有时间再修吧。
Comments | NOTHING