游戏内容

游戏有n个round,每个round发射10次trial,每个trial的飞碟都可能不同,包括速度角度得分等,使用鼠标进行射击,点中即表示射击成功。

游戏要求

使用带缓存的工厂模式来管理飞碟的生产与再利用,工厂使用单例模式。

游戏的设计

  1. 首先是设计一个制造飞碟的工厂
    由于需要使用带缓存的工厂,所以使用两个list来储存正在使用的飞碟,与没有使用的飞碟。每次需要工厂输出一个飞碟的时候就去未被使用的链中寻找相应的飞碟,如果有就直接拿到正在使用的飞碟的链中,并返回;如果没有就需要创建一个相应的飞碟,并放入正在使用的飞碟的链中。这样在一开始会不断的创建飞碟,但是创建之后的飞碟并没有被删除,而是存起来了,简单的将其active设置为false即可,这样就被隐形了,再次使用的时候初始化一下位置即可,达到循环使用的目的。下面给出工厂中生产飞碟的代码:
public GameObject getufo(int round){ufo s = new ufo();GameObject ufo_ = null;string type_ = getufotype(round);for(int i = 0; i < rest.Count; i++){if (rest[i]._ufo.gameObject.tag == type_){ufo_ = rest[i]._ufo;rest.Remove(rest[i]);ufo_.gameObject.SetActive(true);break;}}if (ufo_ == null){if (type_ == "u1"){ufo_ = Instantiate(Resources.Load<GameObject>("ufo_u1"), bottom, Quaternion.identity);}else if (type_ == "u2"){ufo_ = Instantiate(Resources.Load<GameObject>("ufo_u2"), bottom, Quaternion.identity);}else{ufo_ = Instantiate(Resources.Load<GameObject>("ufo_u3"), bottom, Quaternion.identity);}//ufo_.GetComponent<ufo>().direction = new Vector3(1, 1, 0);ufo_.tag = type_;int r = Random.Range(0, 1);s.direction = new Vector3(0, r, 0);s._ufo = ufo_;}ufo_.transform.position = bottom;s._ufo = ufo_;use.Add(s);//Debug.Log("in have " + use.Count);return ufo_;}

这里的tag是对飞碟对象的一个标记,这里用了3种飞碟,所以只使用3个tag即可,对于tag的使用需要自己去添加


这样就可以直接设置了。

然后是对飞碟的回收:

public void free(GameObject ufo_){for(int i = 0; i < use.Count; i++){if (ufo_.GetInstanceID() == use[i]._ufo.gameObject.GetInstanceID()){use[i]._ufo.gameObject.SetActive(false);rest.Add(use[i]);use.Remove(use[i]);break;}}}

使用GetInstanceID来确认需要回收的飞碟是链中的哪一个,找到之后将其从使用链中删去,再添加到未使用链中,同时设置其不可见。

  1. 设计控制游戏的运行类,即导演
    在这个控制类中需要有一个工厂来持续生产飞碟,然后还需要再设计一个集合来储存需要运行的飞碟,这里其实可以直接调用工厂里的正在使用的链,但是为了做到尽可能少的耦合,就分开来处理。
    对于飞碟的运动在update函数中实现,这点很简单。然后是对每个trial的设置,需要对两个trial之间的间隔时间进行控制,然后每次trial根据一个规则输出数量不同的飞碟。然后将工厂中拿到的飞碟放到之前说的那个集合中,表示场景中正在使用与运动的飞碟。接着调用移动的函数,让飞碟按照既定的路线运动,具体代码如下:
void Update () {Debug.Log(r.finish());if (r.finish() == true){textmesh.text = "finish and your score is: " + r.getScore();restart();while (flyufo.Count > 0){remove(flyufo[0]);}}if (r.getStart() == true && r.finish() == false){textmesh.text = "round " + r.getround() + " score: " + r.getScore();interval += Time.deltaTime;if (interval > 2f){r.nextTrial();//int left = number - flyufo.Count;int left = r.getNumberOfufo();//Debug.Log(fac.use.Count);for (int i = 0; i < left; i++){//display.Add(fac.getufo(1));flyufo.Add(fac.getufo(r.getround()));float x = Random.Range(-2f, 2f);float y = Random.Range(0f, 1f);float z = Random.Range(1f, 2f);//Debug.Log("" + x);dir.Add(new Vector3(x, y, z));}interval = 0;}//Debug.Log("out have " + fac.use.Count);ti += Time.deltaTime;for (int i = 0; i < flyufo.Count; i++){if (i <= shownum){move(flyufo[i], dir[i]);}if (ti > 2f){shownum++;ti = 0;}}if (Input.GetButtonDown("Fire1")){Vector3 mousePosition = Input.mousePosition;Ray ray = cam.ScreenPointToRay(mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit)){r.addscore(hit.transform.gameObject.tag);remove(hit.transform.gameObject);}}outscreen();//Debug.Log("now round " + r.getround() + " trial " + r.gettrial() + " score " + r.getScore());}}

在每次运动之后还需要判断一下飞碟是否飞出视野,一旦飞碟飞出了一段距离就需要判定它消失(当然不能给射击者加分),如果不处理这个问题的话,飞碟就会一直存在,一直飞下去,也无法得到重用,玩家也无法将其射中,这样就会耗费资源,降低游戏效率

  1. 对规则的控制
    对于每个round输出的飞碟与飞碟的分数等信息都需要一个规则来控制,这里对规则的设计很简单,也包括对游戏的运行的控制。具体内容见代码即可。

  2. UI的一些显示
    这里使用了一个text来显示游戏的得分等相关信息,具体设计如下。
    首先得到这个文本框

    注意这里需要对游戏中建立的空对象添加相应的组件


    添加这个text mesh,然后就可以在游戏中调用并对它进行设置了。
    其设置内容的方法与位置如下

然后是添加一个开始按钮

用户的点击射击

这里模拟一条射线来射击,调用Raycast来查看是否射中,射中的对象就是hit,然后对这个对象进行操作即可。这里使用的cam是一个camera,在start中进行初始化,为主摄像机

  1. 单例模式的使用
    直接将老师提供的代码ctrl c加ctrl v,然后直接调用即可。

至此整个游戏的设计完成,下面是游戏运行中的截图

项目地址

unity3d实现简单的打飞碟游戏相关推荐

  1. 做一个简单的打飞碟游戏

    简介 就是一个简单的打飞碟游戏..游戏难度会随着你获得的分数提升,胜利条件是获得1000分. 对象处理 就简单的一个飞碟预制就行了(十分简单,就一个圆柱体..完毕) 还有一个粒子系统用来模拟飞碟被击中 ...

  2. Unity3D笔记---简单的捕鱼小游戏

    说是捕鱼达人小游戏,其实也没有完全实现捕鱼的功能,只是一个Unity3D前期学习过程中对于Sprite2D的运用,下面我来介绍一下我的界面 界面组成很简单,主要是生成鱼,以及与的运动,子弹的运动,碰撞 ...

  3. unity3d开发鼠标打飞碟游戏(Hit UFO)

    这次我们用Unity3d开发一个简单的打飞碟游戏 游戏简介 游戏有3个回合,每个回合会发射n中颜色的飞碟,击中飞碟会得到相应的分数,其中,击中黄色飞碟得1分,击中蓝色飞碟得2分,红色飞碟4分,击不中不 ...

  4. Unity 3D-learning 简单打飞碟游戏

    一.编写一个简单的打飞碟游戏 游戏内容要求: 游戏有 n 个 round,每个 round 都包括10 次 trial: 每个 trial 的飞碟的色彩.大小.发射位置.速度.角度.同时出现的个数都可 ...

  5. 【Unity3d学习】使用物理引擎——打飞碟游戏的物理引擎改进与射箭游戏设计

    文章目录 写在前面 HitUFO的物理引擎改进版本 物理引擎的改进版本思路与实现 PhysicsAction PhysicsManager 新接口类IActionManager 动作管理器基类的变化 ...

  6. 用Unity3D实现简单的井字棋小游戏

    用Unity3D实现简单的井字棋小游戏 项目地址 井字棋小游戏 完成效果图 实现思路 首先定义游戏的数据部分: /* 井字棋中每一个棋格中的逻辑控制常量,代表这个棋格的状态 */ private co ...

  7. unity3D游戏-打飞碟游戏改进版

    打飞碟(Hit UFO)游戏改进版 内容要求 按 adapter模式 设计图修改飞碟游戏 使它同时支持物理运动与运动学(变换)运动 适配器模式 适配器模式将某个类的接口转换成另一个接口表示,目的是兼容 ...

  8. Unity3D简单的打飞机游戏

    Unity3D简单的打飞机游戏 这是下载地址,请自行下载 这是下载地址,请自行下载

  9. Unity3D学习:飞碟游戏进化版

    上一个做的飞碟游戏虽然是功能也齐全,但是我感觉架构不是很好有点紊乱,不利于后期维护以及改进,所以我按照一个完整的架构重新做了一次,思路更清晰,而且还添加了更多的功能.这次的飞碟游戏是两个关卡,50分上 ...

最新文章

  1. python排名上升_Python在TIOBE Index排名或將取代Java成為第2名
  2. Oracle数据库远程连接方式之一:不需要安装客户端软件方法!
  3. typedef的用法总结
  4. hadoop启动碰到java.net.UnknownHostException
  5. vscode浏览器打开html
  6. Unity AssetBundles and Resources指引 (三) AssetBundle基础
  7. 301. Remove Invalid Parentheses
  8. 计算机的组成 —— 磁盘阵列(RAID)
  9. kettle使用文件导入到Postgresql出现如下几种问题的总结
  10. MATLAB清除内存中变量
  11. 学计算机应用技术掉头发,为什么程序员更容易脱发呢?
  12. sqlserver只剩mdf数据文件如何附加
  13. 【课堂笔记精选】为了能够用“Unity”软件做游戏,我要从最基础的开始复习JavaScript...
  14. Cocos Creator 3D使用腾讯云游戏联机对战引擎(MGOBE)
  15. 论文精读:D3S:D3S – A Discriminative Single Shot Segmentation Tracker
  16. JS实现TTS语音播报
  17. Python爬虫突然提取不出信息了,返回的是空列表的解决办法
  18. RK3588-ROCK5B上手体验
  19. Java调用Zebra800条码打印机
  20. ElementUI 表单单个验证

热门文章

  1. 计算机硬件创意海报,游戏设计一机搞定 机械师创物者设计本评测
  2. 麦德龙中国正式引进高品质法国牛肉
  3. 蓝桥杯 无聊的逗(java)
  4. 示波器探头上的×10
  5. 没学懂汇编写了个CE·····
  6. m4v格式如何转换mp4?分享m4v转换mp4的方法
  7. DSP软件测试用例,DSP汇编语言软件测试方法研究.doc
  8. android 短信 代码错误,android – Firebase手机身份验证错误:短信代码已过期
  9. CFO和财务VP的OKR案例,打造并领导世界一流的金融团队
  10. 杰克.韦尔奇的《赢》读后节选