钻石手稿是十天前开始动工制作的,现在主要功能已基本完成,可以在itch下载试玩,在这里把我这九天遇到的主要问题和参考解决方法总结一下
首先列一下这几天的工作内容,因为是很早就想做的游戏,所以在策划设计上特别省事
- DAY1:画风探索
- DAY2:模型制作 高模光边
- DAY3:特效定型,压力测试
- DAY4:漫游
- DAY5:碰撞检测,Manifold Garden画风
- DAY6:操作?PREFAB,远近,外发光,色彩
- DAY7:消去,选色,材质,模糊,粒子-world
- DAY8:UI,坐标,背光,存读,弃主界面
- DAY9:存读界面,宣传视频,查错
- DAY10:结题,发表
首先是第一天,也就是上周一,主要进行了画风的探索,首先我想到的就是去年的游戏《_prism》的画风
prism的模型特色包括光边和光面两个,在去年我曾经给作者推特聊过,对于光边是把UV导出图作为材质的emission输出,而每个发光面其实是另一个模型面
由于对建造游戏来说,比起细节来说更重要的还是大数量的效率,对每个面都额外处理要求太高,就放弃了,不过prism的特效还是值得学习,这方面作者还写了一篇“10 Quick, Visually Stunning Tricks”
而我用的是unity官方的特效包,Post Processing Stack,然后当天的效果是这样的
接下来是第二天,基本确定了一个画风,就开始具体制作模型,不像MC只有方块,这个游戏的模型有九个尺寸,分开制作,建模软件用的是blender,因为是简单模型,制作流程是定点,造面,分UV,(切圆角),导出。虽然基础模型是只有几十个点线面,但九倍切圆角之后就几千面了,从上图也能看出些许差别,但还是太微小,最后还是放弃使用了
当天也完成了UV高光的制作,一开始我以为只是导出UV图分分钟的事,后来发现导出UV图其实是面白而不是边白……于是我只能在PS里面魔棒选中,缩小选区,涂上黑色(其实是缩小选区,涂成灰色,再缩小,再涂深灰……来达到渐变效果)
接下来是第三天,在这一天正式确定了画风,也就是游戏里的样子,但是景深DOF居然会受分辨率的影响,同样的距离,分辨率越大越模糊,看来以后还要慎用,途中也做了个测试效率的场景
接着是第四天,这一天开始制作角色的漫游功能,这一天没什么好说的,因为白天我有事出了趟初级远门,归来效率并不高,唯一坑的就是transform.Translate (moveDir,Space.World); 后面的Space.World不能省略
第五天的主要工作是完成碰撞体的制作,,对于碰撞体来说,尤其要注意的是它们都是凸多面体,也就是说表面有坑是不行的,中间有个洞就更加不行,应对这个问题的解决方法是为目标gameObject添加很多子object,每一个都包含一个凸多面体,对于我的游戏来说就是四条边四个碰撞体
因为我的游戏中两物体接触不穿越是不算碰撞的,所以碰撞体比实际模型稍微小一圈
在周五末尾还着重研究了一下Manifold Garden的外发光特效,想着我是不是也可以沿用这种画风,但初步尝试没什么成果,就放弃了
接下来是周六,在这一天完成了游戏的主要操作,整合了九种模型的prefab,还添加了一个碰撞检测的红黄绿外发光效果,这个效果来自asset store搜索的第一个,之后基本按照MC羊毛的十六色来确定了游戏的色彩
第七天,虽然是星期天反而进度最快……首先是完成了选色功能,使用了GTA5选武器的思路,TAB+鼠标,这方面用的是一篇Y2B教程所用的方法,需要科学上网,但是色盘的图画的太差了,所以我就加上了模糊,关于模糊UI的做法则是另一篇Y2B教程
之后完成了游戏的删除模式,用的是raycast的方法,之后给场景添加粒子特效,如果想要粒子不动但发射源跟随相机跑的话,需要把粒子的Simulation Space改成world
还有一个比较坑的地方是鼠标的移动限制,如果直接设置Cursor.lockState = CursorLockMode.Confined;八成会没有效果,需要先设置为CursorLockMode.None, 再设置为Confined,Locked设置同理
接着来到第八天,这一天主要完成了游戏的UI,字体使用的是unity官方经常使用的luckiest-guy,是个免费字体,之后完成了背景颜色的设置界面,这方面选色的也是一个asset store的免费资源
之后就是游戏的存储功能了,这方面用的是著名的easy save 2,具体思路是在建造过程中就在内存中主动记录每个积木体素的位置,方向,以及尺寸,颜色的数字代号,之后用ES2保存,读取的时候首先清空场景,在依次生成所有体素,顺便把体素信息重新写回内存的记录表覆盖
值得注意的是ES2存储时使用特有的tag做存储单元的名字,一般命名就是tag=1,tag=2.……tag=1000,tag=Hello也是可以的,但如果存储数量庞大,一堆tag就会过度使用string导致庞大的GC,而使存储过程非常缓慢,如果要存储同类型的数据,比如1000个int,只需要存一个list<int>就好了,tag=myListOfint神马的
第九天也就是昨天,最后把存读界面搭建起来,调用之前写好的方法,这个游戏就算基本完工了,顺便连视频也录好了,有个问题是我是用的外发光插件,不知道为什么重新加载场景就会失效,所以主界面来到游戏界面的构想就放弃了,整个游戏都是在一个scene里完成的
于是在今天,最后找了找bug,然后就结题发表了
要说最大的遗憾,就是我在代码中用了太多的bool来做状态判断,是否在观赏模式,是否在删除模式,是否在选色模式,是否在UI界面,全部写完之后才发觉应该用个状态机的,不过既然没bug安全度过了就算了……还有scriptable object总是在项目关闭下次打开时失效,说什么找不到代码,暂时不知道是什么问题
钻石手稿的开发到这里就告一段落了,想当初想要做这个游戏的初衷,只是小时候没有玩到这个玩具的怨念而已,后来我想把它做大,像minecraft一样,甚至连名字都冲着谐音去取,还研究了MC的基本做法,才发现这种略复杂的形状是达不到十万百万块那么高的效率的,而且UE4的效率就尤其不行,然后就搁置了一年多,直到现在,在五月初,我还是想把这个游戏和linelight的玩法结合,让玩家自己造出三维的复杂轨道,但是一时做不出来,也就等着将来有机会做个DD2吧
虽然是个简单游戏,这也算是我今年征战IndiePlay的第一枪了,接下来还有40多天,正好我还有一个模糊的创意,不知道能不能在最后期限里超越光速做游戏呢
不过最近在脑洞策划阶段还是安心看看阿法狗还有加勒比海盗,还有纸牌屋,再悼念下勇度
好详细的制作分享啊,新手表示一脸懵逼……
@无有时代:我自己的工作也只是停留在表层,像之前我说的自己的强项是信息检索……就因为搜到的外发光资源包不太兼容,我连主界面都不能加
@SpiritJZL:这个信息检索是指百度的文字识别搜索还是单纯的找解决方案……
为什么资源包不兼容就不能加主界面呢?不就是简单的切换场景吗?
@无有时代:当然是找解决方案啦(当然平时除了找解决方案也会找一些别的东西),不知道为什么只要切换场景资源就不能用了……
最近由 SpiritJZL 修改于:2017-06-04 19:32:19@SpiritJZL:嗯……这可能是untiy自带的蜜汁bug,新开个工程重新载入资源试试?问问论坛?
@无有时代:还好是个用处不太大的资源,然后就放下了