编写一个简单的鼠标打飞碟(Hit UFO)游戏
- 游戏内容要求:
- 游戏有 n 个 round,每个 round 都包括10 次 trial;
- 每个 trial 的飞碟的色彩、大小、发射位置、速度、角度、同时出现的个数都可能不同。它们由该 round 的 ruler 控制;
- 每个 trial 的飞碟有随机性,总体难度随 round 上升;
- 鼠标点中得分,得分规则按色彩、大小、速度不同计算,规则可自由设定。
- 游戏的要求:
- 使用带缓存的工厂模式管理不同飞碟的生产与回收,该工厂必须是场景单实例的!具体实现见参考资源 Singleton 模板类
- 尽可能使用前面 MVC 结构实现人机交互与游戏模型分离
我的游戏
游戏视频链接:密码:1111
游戏规则:
- 点击start按钮开始游戏,鼠标点中飞碟得分
- 每个飞碟的色彩、发射位置随机,由round的rules规定
- 每一轮飞碟飞行速度逐渐增加(难度增加),击打所对应的分值也相应增加
- 每一轮包括10个飞碟,飞碟全部发射完毕,无条件进入下一轮
- 点击restart按钮清空分数和关卡记录,从第一关开始
游戏截图:
实现思路:
按照课件的UML图进行游戏设计。
- 制作飞碟的预制,我用的是cylinder,因此如果将localscale和rule关联,就可能出现不像飞盘(飞碟)的情况。于是手动指定scale,分别是3, 0.3, 2
- 利用单例模式进行类间通信,如
Singleton<DiskFactory>.Instance.FreeDisk(disk);
factory = Singleton<DiskFactory>.Instance;
recorder = Singleton<ScoreRecorder>.Instance;
- 分别实现RoundController、DiskFactory、ScoreRecorder,挂在主摄像机上即可
- 交互使用UserGUI,同上次作业一样
*具体实现代码有参考Unity学习笔记(九)——简单打飞碟游戏 & 改进
一些bug或困难记录
1.是OnGUI而不是onGUI。这个在score显示的时候卡了很久,查了一下GUI不显示Texture的方法,一一实践发现并不能够解决。用debug输出信息发现居然没有调用这个函数,仔细一看打错函数名了…(虽然是我粗心写错但还是附上一个链接方便以后查看:关于unity中GUITEXT出现不显示问题)
2.关于飞盘的样式:一开始的确想让它们每一关长得不一样,但是考虑到飞盘大概都长得差不多,干脆统一定制(只针对形状),否则看起来就不像飞盘了。
3.关于起止位置:最开始是想让飞盘往游戏者这边飞,而不是像查到的一些实现一样往远处走。但是实际操作了一下存在问题,一个是如果定义vector3.z太小,会在界面上出现【等待飞出的飞盘】,毕竟随机也是要有指定位置的。但如果定义得太大,远是远了,可以达到“看不见”的效果,但是考虑到实际情况,模拟真正的飞盘飞出,重力加速度会让飞盘无法坚持,在还未来到游戏者面前就已经掉落。
4.关于public和private的选择::脚本中定义的public变量在 inspection中是可以手动修改的,一开始没想那么多全部都设成public(一个很坏的习惯),然后就出现round随意改、score随意改等等不符合游戏规则的“bug”于是决定只把每轮的飞碟数设成public,这个可以让玩家修改,一轮要扔出多少个飞碟。
5.关于游戏规则:最初的想法是设定一个阈值,每一关要大于某个值才能进入到下一关,否则游戏失败游戏结束。但是遇到了一点问题,比如:
if (GUI.Button(new Rect(width + 110, height, 50, 30), "start"){
this.nextRound();
}
我的想法是嵌套if
if(score>x)
this.nextRound();
else {
GUI.TextArea(new Rect(width + 300, height + 200, 100, 30), "Game Over!");
}
但是不知道为什么,它不会进入到else语句(用debug测试过了)
时间比较紧,这个问题没有得到解决….以后有时间再弄吧
有用的链接:
Unity知识一:简单的点击事件
Unity3d与设计模式(三)工厂模式
https://www.cnblogs.com/flyFreeZn/p/4026026.html