飞碟游戏改进

这次作业在上一次打飞碟游戏的基础上增加了adapter设计模式,用来统一物理运动和运动学动作管理器的接口,使得游戏可以动态改变飞碟的行为,同时支持物理运动和运动学变换,具有更高的可扩展性。

适配器模式

在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。

在这个游戏中我采用对象适配器模式,adapter类持有不同的动作管理器对象,并实现想暴露的接口,这样做使用成本更低且更加灵活。具体结构可看UML图。

UML图

关键代码解释

动作管理器统一接口

首先定义我希望得到的动作接口

public interface IActionManager{void addForceOnUFO(GameObject UFO);}

适配器类

UFOActionAdapter 类实现了上面定义的接口并且分别持有PhysisActionManager 和CCActionManager 的单例对象。whichActionManager 用来表示当前使用的动作管理器是哪一个。

public class UFOActionAdapter : IActionManager{private PhysisActionManager physisActionManager;private CCActionManager ccActionManager;int whichActionManager = 0; // 0 -> CCActionManager, 1 -> PhysisActionManagerpublic UFOActionAdapter(){physisActionManager = PhysisActionManager.getInstance();ccActionManager = CCActionManager.getInstance();}public void switchActionMode(){whichActionManager = 1 - whichActionManager;}public void addForceOnUFO(GameObject UFO){if(whichActionManager == 1){physisActionManager.addForce(UFO);}else{ccActionManager.addForce(UFO);}}}

物理运动管理器

PhysisActionManager主要给游戏对象刚体添加一个一定范围内随机生成的力,并且模式为Impulse模式,表示一个瞬时的力。

public class PhysisActionManager{private SceneController scene;private static PhysisActionManager instance;private PhysisActionManager(){scene = SceneController.getInstance();}public static PhysisActionManager getInstance(){if (instance == null) instance = new PhysisActionManager();return instance;}public void addForce(GameObject UFO){Vector3 force = getRandomForce();UFO.GetComponent<Rigidbody>().useGravity = true;UFO.GetComponent<Rigidbody>().AddForce(force, ForceMode.Impulse);}private Vector3 getRandomForce(){int x = UnityEngine.Random.Range(-30, 31);int y = UnityEngine.Random.Range(30, 41);int z = UnityEngine.Random.Range(20, 31);float t = 0.7f + scene.getTrailNum() / 20;return new Vector3(x, y, z) * t;}}

运动学运动管理器

CCActionManager把游戏对象刚体属性useGravity设置为false,然后给予刚体一个速度使其朝着一个方向运动。

public class CCActionManager{private SceneController scene;private static CCActionManager instance;private CCActionManager(){scene = SceneController.getInstance();}public static CCActionManager getInstance(){if (instance == null) instance = new CCActionManager();return instance;}public void addForce(GameObject UFO){// 控制飞碟向某个随机方向持续移动UFO.GetComponent<Rigidbody>().useGravity = false;UFO.GetComponent<Rigidbody>().velocity = new Vector3(5, 15, 5);}}

用户接口

UserInterface类的Update方法中检测鼠标右键,当被按下的时候切换动作管理器。

if (Input.GetButtonDown("Fire2")){action.switchActionInNextRound();}

我们应该是等到下一个trial开始的时候才执行动作管理器的更改(如果需要更改的话),这里我在场记中用一个成员变量来标记是否需要更改,在控制发射飞碟之前再根据这个值来执行修改。代码如下:

public void switchActionInNextRound(){myStatusCtrl.showSwitchText();switchActionManager = true;}
public void launchUFO(){if (switchActionManager){switchActionManager = false;myUFOCtrl.switchActionManager();}//每次发射之前清0分数myStatusCtrl.resetScore();myUFOCtrl.launchUFO();}

最终效果

视频演示地址如下:https://www.bilibili.com/video/av22511301/

所有代码见github:https://github.com/CarolSum/Unity3d-Learning/tree/master/hw5

Unity3D 飞碟游戏改进版相关推荐

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

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

  2. Unity 3D-learning 打飞碟游戏改进版ben

    一.改进打飞碟游戏 游戏内容要求: 按 adapter模式 设计图修改飞碟游戏 使它同时支持物理运动与运动学(变换)运动 adapter模式设计简要展示: SceneController 类,作为 A ...

  3. 3D游戏编程与设计作业6-Unity实现打飞碟游戏改进版(Hit UFO)

    改进飞碟(Hit UFO)游戏 游戏内容要求 按adapter模式设计图修改飞碟游戏 使它同时支持物理运动与运动学(交换)运动 编程实践 本次作业直接在上一次打飞碟游戏的基础上增加adapter设计模 ...

  4. unity3d 飞碟游戏

    编写一个简单的鼠标打飞碟(Hit UFO)游戏 动作管理器统一接口 public interface SceneController {void load();void game(int Round) ...

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

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

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

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

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

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

  8. Unity3d——打飞碟游戏(终极版)

    前段时间比较忙,囫囵吞枣学了个大概,作业写的也很烂,趁最近有空整理一下,认真写一次打飞碟游戏(主要是总结一下导演场记动作管理这些面向对象设计) 放个UML图 1.SSDirection,导演对象负责 ...

  9. android unity hook,[原创]Unity3d安卓游戏DLL动态调式与HOOK基础

    [原创]Unity3d安卓游戏DLL动态调式与HOOK基础 2016-4-4 02:40 8207 [原创]Unity3d安卓游戏DLL动态调式与HOOK基础 2016-4-4 02:40 8207 ...

最新文章

  1. 串口端口被占用的解决方法
  2. 2、SQL的基本书写规则
  3. 创建Silverlight 1.0 開發環境
  4. oracle索引总结
  5. [翻译]现代Linux系统上的栈溢出攻击【转】
  6. 计算机网络四个阶段的发展特点,计算机网络的发展分哪四个阶段,特点?
  7. 苹果再遭诉讼!因两步验证太过耗时...
  8. 系统架构技能之设计模式-抽象工厂模式
  9. Linux中的三个特殊文件
  10. 机器学习(七):贝叶斯之新闻分类器
  11. booth算法原理的简单化理解
  12. 物联网PaaS平台大盘点
  13. 如何将视频生成M3U8文件格式?
  14. 使用尾注添加参考文献并删除尾注中的横线和空格
  15. 2022年测试工程师高频面试题及答案【python篇】
  16. 【多线程/线程池】项目中实际应用场景
  17. 爱好数学的国王 C++
  18. 原生爬虫爬取虎牙绝地求生直播热度排行榜
  19. apk在android12设备无法安装(兼容android 12或更高版本)
  20. flv视频转换成mp4格式怎么转?

热门文章

  1. Speedoffice(Excel)中如何标记重复内容
  2. 企业电子招投标系统之首页设计
  3. MapReduce的经典入门案例
  4. SpringBoot-中英文页面切换(国际化)
  5. 山寨不了你,就要使出混身解数置你于死地,某多只是马前卒
  6. 03-数据解析_正则表达式(03 【实战】古诗文网爬虫)
  7. Dockerfile RUN指令 语法解析
  8. angular的run方法
  9. 日志-syslog系统日志
  10. Linux部署Python项目