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模式相关推荐

  1. Unity实现简易打飞碟(Hit UFO)

    Unity实现简易打飞碟(Hit UFO) 前言 这是中山大学数据科学与计算机学院2019年3D游戏编程与设计的第四次作业 所有项目与代码已上传至github当中,欢迎大家访问. github个人主页 ...

  2. unity实现鼠标打飞碟(Hit UFO)游戏

    unity实现鼠标打飞碟(Hit UFO)游戏 游戏规则及要求 规则:玩家初始有5条生命,每漏过一个飞碟,生命减一.游戏分数的增加与命中飞碟时的位置有关,越早击中飞碟分数越高.游戏有四档难度,随分数递 ...

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

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

  4. Unity实现简易打飞碟改进版(Hit UFO)

    Unity实现简易打飞碟改进版(Hit UFO) 前言 这是中山大学数据科学与计算机学院2019年3D游戏编程与设计的第六次作业 所有项目与代码已上传至github当中,欢迎大家访问. github个 ...

  5. Unity3d Note5(鼠标打飞碟(Hit UFO)游戏)

    1.作业要求 2.具体设计 (1).制备预制体作为飞碟 (2).了解一下Singleton模板类 (3).了解一下工厂模式 (3).设计具体要实现的类 3.程序代码 成果视频 1.作业要求 编写一个简 ...

  6. 改进飞碟(Hit UFO)游戏

    1.改进飞碟(Hit UFO)游戏: 游戏内容要求: 按 adapter模式 设计图修改飞碟游戏 使它同时支持物理运动与运动学(变换)运动 新增的类或者有修改的类如下: ActionManagerAd ...

  7. Unity游戏Hit UFO实现

    Unity游戏Hit UFO 实现 一.游戏内容 游戏有n个round,每个round都包括10次trial 每个trail的飞碟颜色.大小.发射位置.速度.角度.同时出现的个数不同. 每个飞碟出现有 ...

  8. 3D游戏设计作业5:改进飞碟(Hit UFO)游戏

    改进飞碟(Hit UFO)游戏: 游戏截图: 1,作业要求 游戏内容要求: 1,按adapter模式设计图修改飞碟游戏 2,使它同时支持物理运动与运动学(变换)运动 2,设计思路 1,分析adapte ...

  9. 3D游戏编程实践——打飞碟(Hit UFO)游戏运动与物理兼容版

    这次编程实践是在上一次实践的基础上,增加了物理运动,做到了运动学和物理运动会的兼容.而原来的代码只实现了运动学部分. 首先需要实现物理运动部分的Action类和ActionManager类. 相比起运 ...

最新文章

  1. javascript开关_JavaScript开关案例简介
  2. 亿级流量架构之服务限流思路与方法
  3. Oracle 之 配置HugePages内存
  4. mybaits二十九:mybatis工作原理以及源码分析
  5. java 用来查找输出的函数_Solr复杂查询一:函数查询
  6. WordPress快速打造个人博客
  7. 一个IT经理眼中的RTX、Simba2013与Lync
  8. 2021大数据1班《Python程序设计基础》学生学期总结
  9. [linux][nginx] 常用2
  10. python 运行pyc_Pyc文件编译和运行
  11. 指定JDK版本运行Tomcat
  12. Android 使用WakeLock
  13. Django 国际化和本地化
  14. 对于程序员来说,“选择比努力更重要”是一句屁话
  15. perl语言语法基础
  16. 最新版的Python写春联,支持行书隶书楷书,不再有缺失汉字
  17. endnotex8使用教程_EndNote X8初级教程(原创)
  18. 远程服务器638,638是什么意思
  19. *** Error 65: Access violation at 0x00000004 : No 'write' permission
  20. “二进制负数 补码右移和原码算术右移 产生的真值偏差”分析

热门文章

  1. 5G套餐正式公布!中国联通如何应对井喷5G咨询?百度知道成新入口
  2. 前端工程师使用adobe XD软件下载切图和测量距离的方法
  3. matlab单相电源在哪里,浅谈基于MATLAB的单相独立光伏逆变电源电路仿真设计
  4. 解决ubuntu 20.04LTS无法安装deb包的问题“无法安装文件:不支持”成功安装VS Code
  5. linux远程打印,OpenSUSE 远程打印教程
  6. 通过经纬度查看地图位置的app
  7. 计算机辅助设计师autocad,计算机辅助设计师CAD制图技巧有哪些
  8. BearyChat 消息推送机器人 For PHP Laravel
  9. Kerberos认证协议中TGS服务器可以去掉吗?
  10. 商场总平面索引图怎么做,区域位置图怎么做的