打飞碟(Hit UFO)游戏

  • 要求
  • 游戏规则
  • 游戏实现
    • 代码结构
      • 导演类
      • 飞碟工厂
      • 场景控制类
      • 动作管理类
      • UI实现
      • 积分规则
  • 游戏运行截图
  • 参考资料

要求

  • 游戏有 n 个 round,每个 round 都包括10 次 trial;
  • 每个 trial 的飞碟的色彩、大小、发射位置、速度、角度、同时出现的个数都可能不同。它们由该 round 的 ruler 控制;
  • 每个 trial 的飞碟有随机性,总体难度随 round 上升;
  • 鼠标点中得分,得分规则按色彩、大小、速度不同计算,规则可自由设定
  • 使用带缓存的工厂模式管理不同飞碟的生产与回收,该工厂必须是场景单实例的
  • 近可能使用前面 MVC 结构实现人机交互与游戏模型分离
    工厂模式:

工厂模式:飞碟工厂的设计模式是单实例的工厂,分数和场景控制及各种预制的分离和使用

游戏规则

  • 每个回合60s,玩过3关之后胜利
  • 飞碟不同的颜色,大小对应不同的分数
  • 回合60s内达到500分进入下一关,不能达到500分则失败

游戏实现

代码结构

导演类

public class SSDirector : System.Object
{public static SSDirector _instance;public ISceneController currentScenceController { get; set; }public bool running { get; set; }public static SSDirector getInstance(){if (_instance == null){_instance = new SSDirector();}return _instance;}public int getFPS(){return Application.targetFrameRate;}public void setFPS(int fps){Application.targetFrameRate = fps;}public void NextScene(){Debug.Log("no next scene");}
}

飞碟工厂

工厂里面实现功能:GetDisk()和FreeDisk()

飞碟工厂类,在场景控制器需要某种飞碟的时候,飞碟工厂从仓库(List free)中获取这种飞碟,如果仓库中没有,则实例化一个新飞碟,然后添加used list 中
当场景控制器发现飞碟被打中或者飞碟掉出摄像机视野外,将执行回收飞碟,在used list 删除飞碟,然后将该飞碟的数据添加到free_list中循环利用

  • 伪代码设计
GetDisk()
IF (free list has disk)
THEN      a_disk = remove one from list
ELSE      a_disk = clone from Prefabs
ENDIF
Set Disk_Data of a_disk with the ruler
Add a_disk to used list
Return a_disk    FreeDisk()
Find disk in used list
IF (not found)
THEN Remove exception
Move disk from used to free list
  • 代码实现
public class DiskFactory : MonoBehaviour {private List<GameObject> used = new List<GameObject>();private List<GameObject> free = new List<GameObject>();private Color[] color = { Color.red, Color.green, Color.blue, Color.yellow };public GameObject GetDisk(int ruler){GameObject a_disk;if (free.Count > 0){a_disk = free[0];free.Remove(free[0]);}else{a_disk = GameObject.Instantiate(Resources.Load("prefabs/Disk")) as GameObject;Debug.Log(a_disk);}a_disk.GetComponent<DiskData>().size = UnityEngine.Random.Range(0, 7-ruler);a_disk.GetComponent<DiskData>().color = color[UnityEngine.Random.Range(0, 4)];a_disk.GetComponent<DiskData>().speed = UnityEngine.Random.Range(5+ruler, 8+ruler);a_disk.transform.localScale = new Vector3(a_disk.GetComponent<DiskData>().size * 2, a_disk.GetComponent<DiskData>().size * 0.1f, a_disk.GetComponent<DiskData>().size * 2);a_disk.GetComponent<Renderer>().material.color = a_disk.GetComponent<DiskData>().color;a_disk.SetActive(true);used.Add(a_disk);return a_disk;}public void FreeDisk(GameObject disk){for(int i = 0; i < used.Count; i++){if(used[i] == disk){disk.SetActive(false);used.Remove(used[i]);free.Add(disk);}}}
}
  • 飞碟数据由round的ruler控制
a_disk.GetComponent<DiskData>().size = UnityEngine.Random.Range(0, 7-ruler);
a_disk.GetComponent<DiskData>().color = color[UnityEngine.Random.Range(0, 4)];
a_disk.GetComponent<DiskData>().speed = UnityEngine.Random.Range(10+ruler, +ruler);

场景控制类

  • 场景单实例,运用模板,可以为每个 MonoBehaviour子类 创建一个对象的实例
public class Singleton<T> where T : MonoBehaviour
{private static T instance;public static T Instance{get{if (instance == null){instance = (T)Object.FindObjectOfType(typeof(T));if (instance == null){Debug.LogError("Can't find instance of " + typeof(T));}}return instance;}}
}
  • 射击条件
public void shoot()
{if (Input.GetMouseButtonDown(0) && (state == State.START || state ==State.CONTINUE)){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit)){if ((SSDirector.getInstance().currentScenceController.state ==State.START || SSDirector.getInstance().currentScenceController.state== State.CONTINUE)){shootAtSth = hit.transform.gameObject;explosion.transform.position =hit.collider.gameObject.transform.position;explosion.GetComponent<Renderer>().material =hit.collider.gameObject.GetComponent<Renderer>().material;explosion.GetComponent<ParticleSystem>().Play();}}}
}
  • 加载飞碟,从飞碟工厂得到飞碟并将飞碟加入场景
  • 检查飞碟是否需要回收
  • 判断游戏状态
 public void Judge(){if(shootAtSth != null && shootAtSth.transform.tag == "Disk" && shootAtSth.activeInHierarchy){scoreRecorder.Record(shootAtSth);diskFactory.FreeDisk(shootAtSth);shootAtSth = null;}if(scoreRecorder.getScore() > 500 * round){round++;leaveSeconds = count = 60;}if (round == 4) {StopAllCoroutines();state = State.WIN;}else if (leaveSeconds == 0 && scoreRecorder.getScore() < 500 * round) {StopAllCoroutines();state = State.LOSE;} elsestate = State.CONTINUE;}

动作管理类

public class RoundActionManager : SSActionManager, ISSActionCallback
{public RoundController scene;public MoveToAction action1, action2;public SequenceAction saction;float speed;public void addRandomAction(GameObject gameObj){int[] X = { -20, 20 };int[] Y = { -5, 5 };int[] Z = { -20, -20 };Vector3 starttPos = new Vector3(UnityEngine.Random.Range(-20, 20),UnityEngine.Random.Range(-5, 5),UnityEngine.Random.Range(50, 10));gameObj.transform.position = starttPos;Vector3 randomTarget = new Vector3(X[UnityEngine.Random.Range(0, 2)],Y[UnityEngine.Random.Range(0, 2)],Z[UnityEngine.Random.Range(0, 2)]);MoveToAction action = MoveToAction.getAction(randomTarget, gameObj.GetComponent<DiskData>().speed);RunAction(gameObj, action, this);}protected  void Start(){scene = (RoundController)SSDirector.getInstance().currentScenceController;scene.actionManager = this;}protected new void Update(){base.Update();}public void actionDone(SSAction source){Debug.Log("Done");}
}

UI实现

代码详见/asset/script/UserGUI.cs

积分规则

飞碟速度越快,体积越小,得到的分数就越高,不同颜色的飞碟得分情况的也不同

public class ScoreRecorder : MonoBehaviour {private float score;public float getScore(){return score;}public void Record(GameObject disk){score += (100 - disk.GetComponent<DiskData>().size *(20 - disk.GetComponent<DiskData>().speed));Color c = disk.GetComponent<DiskData>().color;switch (c.ToString()){case "red":score += 250;break;case "green":score += 200;break;case "blue":score += 150;break;case "yellow":score += 100;break;}}

游戏运行截图

项目链接
视频演示链接

参考资料

感谢此篇参考博客
爆炸效果学习

Unity3D-打飞碟小游戏相关推荐

  1. ch05与游戏世界交互——鼠标打飞碟小游戏

    游戏内容要求: 游戏有 n 个 round,每个 round 都包括10 次 trial. 每个 trial 的飞碟的色彩.大小.发射位置.速度.角度.同时出现的个数都可能不同.它们由该 round ...

  2. Unity3D 2D射击小游戏瞄准线的实现

    Unity3D 2D射击小游戏瞄准线的实现 0. 前言 本片文章是对 https://www.bilibili.com/video/bv1sY411V7tx 视频中瞄准线是如何实现的一个讲解教程,欢迎 ...

  3. 【游戏开发】unity教程4 打飞碟小游戏

    github传送门:https://github.com/dongzizhu/unity3DLearning/tree/master/hw4/Disk 视频传送门:https://space.bili ...

  4. 基于Unity3D的AR小游戏开发【100011412】

    本科毕业设计(论文) GRADUATION DESIGN(THESIS) 基于 Unity3D 的增强现实游戏程序 摘要 增强现实(AR)作为一项新兴技术近年来被越来越多的人群所获知,AR 也渐渐走进 ...

  5. unity3d射箭模拟小游戏

    射箭小游戏制作过程 介绍 项目总览 注意 箭矢(Arrow) 箭矢跟随鼠标旋转 箭矢中靶的事件响应 箭矢碰撞处理 中靶计分 箭矢控制类(ArrowController) 箭矢回收 箭矢创建 箭矢运动 ...

  6. 用Unity3D开发2D小游戏 Flappy Bird

    简介: 最近在学习Unity3D,用了两天时间做了个小游戏打算放上了和大家分享一下,项目名定义为Flapping,是参考Flappy Bird做的,高手勿喷. 这是原本游戏效果图: 这是本项目效果图: ...

  7. 交互入门——基于鼠标控制的射击飞碟小游戏

    文章目录 游戏要求 游戏制作代码 用户交互接口 单例模板 飞碟工厂 动作相关类 飞碟飞行类: 飞行动作管理器 Controller场景控制器 裁判类 UI 游戏截图 游戏要求 游戏内容要求: 游戏有 ...

  8. 3d学习笔记(四)——打飞碟小游戏

    题目 编写一个简单的鼠标打飞碟(Hit UFO)游戏 游戏内容要求: 游戏有 n 个 round,每个 round 都包括10 次 trial: 每个 trial的飞碟的色彩.大小.发射位置.速度.角 ...

  9. Unity-3D捕鱼达人小游戏开发 —— 起因和开始的设置以及准备工作

    起因 假期里的软件实践课,使用Unity-3D写一个游戏,试想也不能太low,但是奈何素材和资源太难找,在论坛上逛到了捕鱼达人的素材,便来试一试 开始 素材毕竟是从网上扒的,我觉得也不好放出来,存在网 ...

最新文章

  1. Android之四大组件(Service的开启与关闭)
  2. android国际化(多语言)
  3. Ant Design使用方法
  4. 通过jS打包下载图片
  5. 为什么在Python中使用string.join(list)而不是list.join(string)?
  6. 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  7. “女神节”男性送礼热门商品榜:“求生欲”极强!
  8. “拒绝访问”协助方案
  9. pythonm 用法-------list实现购物车
  10. [转载] c++的vector赋值方法汇总
  11. selenium-webdriver——让chrome跑起来
  12. oracle数据库基础笔试题,Oracle数据库入门笔试试题及参考答案
  13. 计算几何小结 我对计算几何的理解以及叉积和点积
  14. Windows 80端口被System进程占用的解决
  15. Edge在IE模式下加载网页 - Edge设置IE兼容性
  16. chrome浏览器扩展打包成crx
  17. 2563: 阿狸和桃子的游戏
  18. 个人“乱七八糟”笔记和摘要
  19. 干货!JAVA容器-自问自答学HashMap
  20. oracle asm密码是什么,ASM有自己的参数、密码、alert、监听文件

热门文章

  1. Java处理Word, Excel, PDF文档的4种开源系统的代码例子
  2. objective-c 语法快速过(5)
  3. C++ 利用 windbg + dump + map + cod 文件分析 crash 原因
  4. 多线程 环形缓冲区_使用环形缓冲区有效登录多线程应用程序
  5. 用Java做的模拟“双色球”机选号码
  6. 三分钟学会快速排序(图示讲解,附代码,通俗易懂)
  7. ImageEdit 展示图片(XAML, C#)
  8. Android基础知识——Android SDK Manager详解
  9. 运放的防护,如何避免电气过载(ESO)
  10. MySQL初级篇——视图的相关概念及应用举例