Unity3D 飞碟游戏改进版
飞碟游戏改进
这次作业在上一次打飞碟游戏的基础上增加了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 飞碟游戏改进版相关推荐
- unity3D游戏-打飞碟游戏改进版
打飞碟(Hit UFO)游戏改进版 内容要求 按 adapter模式 设计图修改飞碟游戏 使它同时支持物理运动与运动学(变换)运动 适配器模式 适配器模式将某个类的接口转换成另一个接口表示,目的是兼容 ...
- Unity 3D-learning 打飞碟游戏改进版ben
一.改进打飞碟游戏 游戏内容要求: 按 adapter模式 设计图修改飞碟游戏 使它同时支持物理运动与运动学(变换)运动 adapter模式设计简要展示: SceneController 类,作为 A ...
- 3D游戏编程与设计作业6-Unity实现打飞碟游戏改进版(Hit UFO)
改进飞碟(Hit UFO)游戏 游戏内容要求 按adapter模式设计图修改飞碟游戏 使它同时支持物理运动与运动学(交换)运动 编程实践 本次作业直接在上一次打飞碟游戏的基础上增加adapter设计模 ...
- unity3d 飞碟游戏
编写一个简单的鼠标打飞碟(Hit UFO)游戏 动作管理器统一接口 public interface SceneController {void load();void game(int Round) ...
- unity3d开发鼠标打飞碟游戏(Hit UFO)
这次我们用Unity3d开发一个简单的打飞碟游戏 游戏简介 游戏有3个回合,每个回合会发射n中颜色的飞碟,击中飞碟会得到相应的分数,其中,击中黄色飞碟得1分,击中蓝色飞碟得2分,红色飞碟4分,击不中不 ...
- 【Unity3d学习】使用物理引擎——打飞碟游戏的物理引擎改进与射箭游戏设计
文章目录 写在前面 HitUFO的物理引擎改进版本 物理引擎的改进版本思路与实现 PhysicsAction PhysicsManager 新接口类IActionManager 动作管理器基类的变化 ...
- Unity3D学习:飞碟游戏进化版
上一个做的飞碟游戏虽然是功能也齐全,但是我感觉架构不是很好有点紊乱,不利于后期维护以及改进,所以我按照一个完整的架构重新做了一次,思路更清晰,而且还添加了更多的功能.这次的飞碟游戏是两个关卡,50分上 ...
- Unity3d——打飞碟游戏(终极版)
前段时间比较忙,囫囵吞枣学了个大概,作业写的也很烂,趁最近有空整理一下,认真写一次打飞碟游戏(主要是总结一下导演场记动作管理这些面向对象设计) 放个UML图 1.SSDirection,导演对象负责 ...
- android unity hook,[原创]Unity3d安卓游戏DLL动态调式与HOOK基础
[原创]Unity3d安卓游戏DLL动态调式与HOOK基础 2016-4-4 02:40 8207 [原创]Unity3d安卓游戏DLL动态调式与HOOK基础 2016-4-4 02:40 8207 ...
最新文章
- 串口端口被占用的解决方法
- 2、SQL的基本书写规则
- 创建Silverlight 1.0 開發環境
- oracle索引总结
- [翻译]现代Linux系统上的栈溢出攻击【转】
- 计算机网络四个阶段的发展特点,计算机网络的发展分哪四个阶段,特点?
- 苹果再遭诉讼!因两步验证太过耗时...
- 系统架构技能之设计模式-抽象工厂模式
- Linux中的三个特殊文件
- 机器学习(七):贝叶斯之新闻分类器
- booth算法原理的简单化理解
- 物联网PaaS平台大盘点
- 如何将视频生成M3U8文件格式?
- 使用尾注添加参考文献并删除尾注中的横线和空格
- 2022年测试工程师高频面试题及答案【python篇】
- 【多线程/线程池】项目中实际应用场景
- 爱好数学的国王 C++
- 原生爬虫爬取虎牙绝地求生直播热度排行榜
- apk在android12设备无法安装(兼容android 12或更高版本)
- flv视频转换成mp4格式怎么转?