Unity实现鼠标打飞碟(Hit UFO)adapter模式
Unity实现鼠标打飞碟(Hit UFO)adapter模式
与上一版本的变化
- 按 adapter模式设计图修改飞碟游戏
- 使它同时支持物理运动与运动学(变换)运动
适配器模式
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
UML类图
由于采用了适配器模式,场景控制器可以通过一个适配器接口来选择不同的运动方式,可以很方便的从物理运动切换到运动学运动。增加了一个物理运动管理类。
代码分析
- IActionManager
场景控制器与适配器的接口,通过该接口场景控制器可以自由选择不同的运动方式。
public interface IActionManager
{void playDisk(Disk disk, bool Mode);
}
- PhysisFlyAction
物理运动动作,控制飞碟的运动轨迹,为刚体飞碟设置重力和初速度,使得飞碟以不同的初速度和重力的影响下飞行。
public class PhysisFlyAction : SSAction
{public float Power = 10;//这个代表发射时的速度private Vector3 MoveSpeed = new Vector3(10,0,0);//初速度public DiskFactory diskfactory;public UserGUI User;public static PhysisFlyAction GetSSAction(float Power,float Angle,float Gravity,Vector3 MoveSpeed){PhysisFlyAction action = ScriptableObject.CreateInstance<PhysisFlyAction>();action.Power = Power;action.MoveSpeed = MoveSpeed;return action;}public override void Update(){}public override void FixedUpdate(){if(this.transform.position.y < -7 || this.transform.position.x > 10){if(this.transform.position.x > 0 && User.HP > 0) User.HP--;diskfactory.FreeDisk(this.gameobject);this.destroy = true;this.callback.SSActionEvent(this);}}public override void Start(){//User = gameObject.AddComponent<UserGUI>() as UserGUI;gameobject.GetComponent<Rigidbody>().velocity = MoveSpeed;gameobject.GetComponent<Rigidbody>().useGravity = true;diskfactory = Singleton<DiskFactory>.Instance;User = Singleton<UserGUI>.Instance;}
}
- PhysisActionManager
物理动作管理类,与CCActionManager一样,通过PhysisFlyAction来管理飞碟的飞行运动。
public class PhysisActionManager : SSActionManager
{private PhysisFlyAction diskfly;protected new void Start(){}public void fly_disk(Disk disk){diskfly = PhysisFlyAction.GetSSAction(disk.Power,disk.Angle,disk.Gravity,disk.MoveSpeed);this.RunAction(disk.getGameObject(), diskfly, this);}
}
- Adapter
适配器,该类继承了IActionManager接口,可以通过Mode状态的不同来选择不同的动作管理器,从而实现不同的运动方式。
public class Adapter : MonoBehaviour,IActionManager
{public MySceneActionManager actionManager;public PhysisActionManager actionManagerPhysis;public void playDisk(Disk disk, bool Mode){if(Mode){actionManagerPhysis.fly_disk(disk);}else{actionManager.fly_disk(disk);}}void Start (){actionManager = gameObject.AddComponent<MySceneActionManager>() as MySceneActionManager;actionManagerPhysis = gameObject.AddComponent<PhysisActionManager>() as PhysisActionManager;}
}
- SSAction
由于刚体运动比较适合使用FixedUpdate,因此增加几行代码
public virtual void FixedUpdate(){throw new System.NotImplementedException();}
- SSActionManager
调用SSAction的FixedUpdate和Update,增加的代码如下
protected void FixedUpdate(){foreach (SSAction ac in waitingAdd){actions[ac.GetInstanceID()] = ac;}waitingAdd.Clear();foreach (KeyValuePair<int, SSAction> kv in actions){SSAction ac = kv.Value;if (ac.destroy){waitingDelete.Add(ac.GetInstanceID());}else if (ac.enable){ac.FixedUpdate();}}foreach (int key in waitingDelete){SSAction ac = actions[key];actions.Remove(key);DestroyObject(ac);}waitingDelete.Clear();}
- Controll 动作管理类
需要将原先的动作管理器改成Adapter,需要飞碟运动时,调用playDisk方法即可。
//actionManager = gameObject.AddComponent<MySceneActionManager>() as MySceneActionManager;actionManager = gameObject.AddComponent<Adapter>() as Adapter;
- UserGUI
在用户界面提供了一个按钮,用户可以点击按钮来实现物理学和运动学运动的转换
if(GUI.Button (new Rect (Screen.width-100, Screen.height-200, 100, 40), "ChangeMode")){Mode = !Mode;}
由于物理运动需要飞碟是刚体,所以为飞碟预制体增加一个刚体属性,并不勾选Use Gravity,这是防止运动学运动时飞碟受到一个初始重力。
运行截图
视频链接
代码链接
Unity实现鼠标打飞碟(Hit UFO)adapter模式相关推荐
- Unity实现简易打飞碟(Hit UFO)
Unity实现简易打飞碟(Hit UFO) 前言 这是中山大学数据科学与计算机学院2019年3D游戏编程与设计的第四次作业 所有项目与代码已上传至github当中,欢迎大家访问. github个人主页 ...
- unity实现鼠标打飞碟(Hit UFO)游戏
unity实现鼠标打飞碟(Hit UFO)游戏 游戏规则及要求 规则:玩家初始有5条生命,每漏过一个飞碟,生命减一.游戏分数的增加与命中飞碟时的位置有关,越早击中飞碟分数越高.游戏有四档难度,随分数递 ...
- 3D游戏编程与设计作业6-Unity实现打飞碟游戏改进版(Hit UFO)
改进飞碟(Hit UFO)游戏 游戏内容要求 按adapter模式设计图修改飞碟游戏 使它同时支持物理运动与运动学(交换)运动 编程实践 本次作业直接在上一次打飞碟游戏的基础上增加adapter设计模 ...
- Unity实现简易打飞碟改进版(Hit UFO)
Unity实现简易打飞碟改进版(Hit UFO) 前言 这是中山大学数据科学与计算机学院2019年3D游戏编程与设计的第六次作业 所有项目与代码已上传至github当中,欢迎大家访问. github个 ...
- Unity3d Note5(鼠标打飞碟(Hit UFO)游戏)
1.作业要求 2.具体设计 (1).制备预制体作为飞碟 (2).了解一下Singleton模板类 (3).了解一下工厂模式 (3).设计具体要实现的类 3.程序代码 成果视频 1.作业要求 编写一个简 ...
- 改进飞碟(Hit UFO)游戏
1.改进飞碟(Hit UFO)游戏: 游戏内容要求: 按 adapter模式 设计图修改飞碟游戏 使它同时支持物理运动与运动学(变换)运动 新增的类或者有修改的类如下: ActionManagerAd ...
- Unity游戏Hit UFO实现
Unity游戏Hit UFO 实现 一.游戏内容 游戏有n个round,每个round都包括10次trial 每个trail的飞碟颜色.大小.发射位置.速度.角度.同时出现的个数不同. 每个飞碟出现有 ...
- 3D游戏设计作业5:改进飞碟(Hit UFO)游戏
改进飞碟(Hit UFO)游戏: 游戏截图: 1,作业要求 游戏内容要求: 1,按adapter模式设计图修改飞碟游戏 2,使它同时支持物理运动与运动学(变换)运动 2,设计思路 1,分析adapte ...
- 3D游戏编程实践——打飞碟(Hit UFO)游戏运动与物理兼容版
这次编程实践是在上一次实践的基础上,增加了物理运动,做到了运动学和物理运动会的兼容.而原来的代码只实现了运动学部分. 首先需要实现物理运动部分的Action类和ActionManager类. 相比起运 ...
最新文章
- javascript开关_JavaScript开关案例简介
- 亿级流量架构之服务限流思路与方法
- Oracle 之 配置HugePages内存
- mybaits二十九:mybatis工作原理以及源码分析
- java 用来查找输出的函数_Solr复杂查询一:函数查询
- WordPress快速打造个人博客
- 一个IT经理眼中的RTX、Simba2013与Lync
- 2021大数据1班《Python程序设计基础》学生学期总结
- [linux][nginx] 常用2
- python 运行pyc_Pyc文件编译和运行
- 指定JDK版本运行Tomcat
- Android 使用WakeLock
- Django 国际化和本地化
- 对于程序员来说,“选择比努力更重要”是一句屁话
- perl语言语法基础
- 最新版的Python写春联,支持行书隶书楷书,不再有缺失汉字
- endnotex8使用教程_EndNote X8初级教程(原创)
- 远程服务器638,638是什么意思
- *** Error 65: Access violation at 0x00000004 : No 'write' permission
- “二进制负数 补码右移和原码算术右移 产生的真值偏差”分析
热门文章
- 5G套餐正式公布!中国联通如何应对井喷5G咨询?百度知道成新入口
- 前端工程师使用adobe XD软件下载切图和测量距离的方法
- matlab单相电源在哪里,浅谈基于MATLAB的单相独立光伏逆变电源电路仿真设计
- 解决ubuntu 20.04LTS无法安装deb包的问题“无法安装文件:不支持”成功安装VS Code
- linux远程打印,OpenSUSE 远程打印教程
- 通过经纬度查看地图位置的app
- 计算机辅助设计师autocad,计算机辅助设计师CAD制图技巧有哪些
- BearyChat 消息推送机器人 For PHP Laravel
- Kerberos认证协议中TGS服务器可以去掉吗?
- 商场总平面索引图怎么做,区域位置图怎么做的