游戏名
《灵魂涂鸦师》
游戏截图
游玩视频
游戏介绍
游戏类型:休闲
游戏人数:1~6
交互强度:中度交互
物理特性使用程度:部分物理
玩法介绍:多人合作进行涂鸦,画技=金币
制作时间:一天实现了画笔和画板的功能,后续进行UI和美术的设计,参考图的导入,商店系统的设计,共20天制作完成
网址:点击玩游戏
游戏设计思路
《灵魂涂鸦师》的游戏灵感来源于最简单的功能,碰撞零件后让零件变色,在此基础上创作出了《灵魂画师》这款游戏。《灵魂涂鸦师》在《灵魂画师》中加入了多人合作的概念,为了让多人游戏的游玩体验更好,将玩家绘画的玩法修改成了涂鸦的玩法。上传作品之后会根据玩家涂鸦正确的块数发放金币奖励,玩家的画技决定着他们能够获得的奖励。金币可以在商店里购买随机的道具,玩家会为了好看的特效和翅膀继续游玩下去,一把变猪枪更是友尽神器。
简单功能+巧妙设计+多人合作+随机商店道具,构成了《灵魂涂鸦师》这款玩法简单但乐趣无穷的游戏。
游戏开发难点与常见问题
1. 对于获取到的参数,先判断是否为空问题。
因为想要给玩家存储金币,所以首先要获取玩家信息存储的参数,因为玩家信息存储第一次必定是空值,所以做了一次是否为空的判断,在服务器上运行的游戏,由于网络或服务器波动或自己逻辑不够精准等原因,不能保证每次都能获取到你想要的参数,所以对于获取到的参数进行调用的时候,推荐先判断参数是否为空,在进行使用。比如使用GetValue()时,需要先判断GetValue() ~= nil,再进行使用。
2. 对于涉及物理主权,又不需要所有人同步的视觉效果表现,写在客户端。
在设计商店时,我想要让商店中的物品旋转起来,做一个视觉效果的展示,由于目前涉及到物理主权的更改,可能会出现卡顿。所以我将对所有人不需要同步展示的效果写在客户端,来保证视觉效果的最佳。
3. 关于多人数据处理问题。
不管你的数据是从哪里来的 ,定义的,获取的,返回的,要想你的数据是对所有人可见的,有效的,数据的路径中一定是包括服务器的。所有对多人有效的数据都要经过服务器的分发才能使所有客户端都看得见变化。
4. 关于值对象的使用。
在游戏制作过程中,我想给画板中颜色块加一个锁定功能,但是颜色块本身并没有这个属性,所以我在被锁定的块下插入值对象,使值对象变成“锁定”这一实体对象的专有属性来使用。包括画笔颜色,画笔是否启用,画布重置颜色参数,本次作品贡献度,本次作品金币所得等等这一类只专属于个体对象的数据,也都是在对象下创建了值对象作为一些新的属性来使用的。
当然也有投票信息这种共有数据的记录,这种记录共有数据的值对象放在服务器就可以,它的数据本身就是被所有客户端共享的。
5. 关于信息存储问题。
在玩家购买道具之后,做玩家道具的信息存储时,由于我们目前的数据存储容量受到512字节的限制,INT型的数据例如金币,积分这些就很容易做存储处理,像装备之类的实体对象或者数据量比较大的就没办法储存,所以使用了通用脚本把装备或者大数据都存到数组中,将其单独设置ID,通过存储和读取ID来进行装备等的存储需求。
6. 关于多人中本次随机数与上次随机数不重复问题。
在设计商店购买随机道具的时候发现的问题,为了实现本次随机数与上次随机数不重复,我用了一个变量记一次上次的随机数,然后跟本次做对比,如果不重复就直接使用,如果重复就重新随机直到得到不重复的数。
但是在多人情况中,我们做数据处理的位置为服务器,变量是所有人共享的,就会出现数据错乱的情况。这个时候就需要使用值对象来记上次的值了,把值对象放在客户端,变量就不会共享,这样每一个人的不重复都是自己的了。
游戏亮点功能实现
1. 画笔功能:通过接触事件给画布染色
画笔脚本位置如下图所示:
2. 颜色板功能: 通过点击事件修改画笔的颜色
颜色板颜色处理脚本如下图所示:
游戏代码框架
代码结构介绍
本地包附件
本地路径:【C:\Users\Administrator\AppData\LocalLow\CodeView\重启世界编辑器\Scene_MyGame】
请复制到本地文件夹的地址框,即可在编辑器本地地图页签下打开该地图
本帖最后由 64萌 于 2020-05-12 13:58 编辑
请登录后评论~