改进飞碟(Hit UFO)游戏

要求

  1. 按 adapter模式 设计图修改飞碟游戏
  2. 使它同时支持物理运动与运动学(变换)运动

实现

原项目:3D编程与游戏设计作业五
仅仅对其中的一些类进行改动就能实现。

飞碟预设

由于要求支持物理运动,因此飞碟的预设需要在原来的基础上加上刚体:

Adapter的实现

adapter是通过不同的状态选择不同的接口,在本作业中是选择不同的动作实现方式(物理/运动学),发现与之前的flyActionController的功能类似,因此把它改写成Adapter:

public class Adapter : SSActionManager {public DiskFlyAction fly;public PhysisFlyAction fly_;public void DiskFly(GameObject disk, int mode, mes information) {int leftOrRight = 1;if (disk.transform.position.x > 0){leftOrRight = -1;}if(mode == 2){fly = DiskFlyAction.GetSSAction(leftOrRight, information.angle, information.speed);this.StartAction(disk, fly);}else{fly_ = PhysisFlyAction.GetSSAction(leftOrRight, information.speed);this.StartAction(disk, fly_);}}
}

通过mode控制运动类型,然后分别调用DiskFlyAction和PhysisFlyAction,这里用到的information是自定义类型,用于存储相关信息。

public struct mes{public float speed;public float angle;
}

PhysisFlyAction && SSAction && DiskFlyAction

PhysisFlyAction类,代码如下:

public class PhysisFlyAction : SSAction
{private bool start_position;public float force;public static PhysisFlyAction GetSSAction(int pos, float force_){PhysisFlyAction action = CreateInstance<PhysisFlyAction>();if(pos == 1){action.start_position = true;}else{action.start_position = false;}action.force = force_;return action;}// Start is called before the first frame updatepublic override void Start(){Rigidbody disk = gameobject.GetComponent<Rigidbody>();gameobject.GetComponent<Rigidbody>().useGravity = true;if(gameobject.GetComponent<Rigidbody>().position.y <= 3){if(start_position){gameobject.GetComponent<Rigidbody>().AddForce(new Vector3(0.4f,0.2f,0)*force*15f, ForceMode.Impulse);}else{gameobject.GetComponent<Rigidbody>().AddForce(new Vector3(-0.4f,0.2f,0)*force*15f, ForceMode.Impulse);}}}// Update is called once per framepublic override void Update(){}public override void FixedUpdate() {if (transform.position.y <= -10f) {Debug.Log(transform.position.y);gameobject.GetComponent<Rigidbody>().useGravity = false;gameobject.GetComponent<Rigidbody>().velocity = new Vector3(0, 0, 0);this.enable = false;}}
}

总体与物理学运动实现类似,但是这里用到了FixedUpdate。
这个类设计的小细节有对重力的改变,在start中,开启了重力,在一个初始力和重力的作用下,飞碟进行抛体运动,当飞碟运动到我们摄像机视线之外(这里是FixedUpdate中提到的-10f)时,则关闭重力。因为如果不关闭重力,飞碟仍然会继续下落,然后等到DiskFactory回收该飞碟进行下一次使用的时候会具有很大的速度,影响游戏体验,如下图(可以看到第三次绿色飞碟出现在右下角的时候具有很大的竖直速度,一闪而过):

由于physic增加了FixedUpdate,因此SSAction、DiskFlyAction也增加了一个空的FixedUpdate:

public class SSAction : ScriptableObject {……    public virtual void FixedUpdate() {throw new System.NotImplementedException();}……
}public class DiskFlyAction : SSAction {……public override void FixedUpdate() {}……
}

FirstController && Interfaces

FirstController的改动有:
增加了一个bool变量,用于记录是物理运动还是运动学变换运动,为了通过UserGUI改变这个变量,还增加了一个setPhysic函数,并且同时在Interfaces中加上方便UserGUI修改。

private bool physic = false;
……
public void setPhysic(bool physic_){physic = physic_;
}

SSActionManager

增加FixedUpdate:

……
if (action.enable) {action.Update();action.FixedUpdate();
}
……

UserGUI

在第一个界面增加了两个按钮,用于选择是否是physic模式。

效果

physic模式:

原本运动学模式仍然正常运行:

源代码:

GitHub

3D游戏编程与设计作业六相关推荐

  1. 3D游戏编程与设计作业10

    3D游戏编程与设计作业10 环境说明 Unity3D 导航与寻路 Agent 和 Navmesh 练习 Obstacle和Off-Mesh-Link练习 P&D 过河游戏智能帮助实现 状态图 ...

  2. 3D游戏编程与设计作业09

    3D游戏编程与设计作业09 UGUI基础 画布 基础概念 测试渲染模式 UI布局基础 基本概念 锚点练习 UI组件与元素 基本概念 Mask练习 动画练习 富文本测试 简单血条 血条(Health B ...

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

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

  4. 3D游戏编程与设计作业4-Skybox_牧师与魔鬼进阶版

    基本操作演练 下载Fantasy Skybbox FREE,构建自己的游戏场景 直接在上一次作业的Priests and Devils游戏场景中添加天空盒和地形构建场景.首先在Unity Assets ...

  5. 3D游戏编程与设计作业四

    第四次3D编程作业 本次作业源代码链接:点击此处进行跳转 一. 基本操作演练 下载Fantasy Skybox Free,构建自己的游戏场景 场景总览图: 游玩截图: 写一个简单的总结,总结游戏对象的 ...

  6. 3D游戏编程与设计作业三

    第三次3D编程作业 本次作业源代码链接:点击此处进行跳转 1. 简答并用程序验证 游戏对象运动的本质是什么 游戏对象空间属性(坐标.旋转度.大小)的变化 请用三种以上方法,实现物体的抛物线运动 此处我 ...

  7. 3D游戏编程与设计作业2-太阳系-Priests and Devils

    简答题 一.游戏对象运动的本质是什么?   游戏对象的本质是游戏对象每一帧的由空间属性决定的坐标随时间发生改变,其中空间属性包括对象transform属性中的空间位置Position属性.旋转角度Ro ...

  8. 3D游戏编程与设计作业一

    游戏分类与热点探索 使用思维导图描述游戏的分类.(游戏分类方法特别多) 所使用的思维导图绘图工具为mindmaster. 结合手机游戏市场的下载量与排名等数据,结合游戏分类图,描述游戏市场的热点. 华 ...

  9. 3D游戏编程与设计作业4——使用skybox构建游戏场景

    步骤1: 首先下载支持使用Fantacy Skybox FREE 的Unity版本(2021.3) 步骤2:打开unity store, 搜索Fantacy Skybox FREE 并进行下载 步骤3 ...

最新文章

  1. Oracle 11g密码过期问题解决方案
  2. insert执行时oracle如何处理,ORACLE中Insert时字符处理
  3. bacula 的安装、配置和运行
  4. NY : 括号匹配问题
  5. HTML中confirm替换,Javascript直接Confirm()函数替换
  6. pipelineDB学习笔记-2. Stream (流)
  7. 锻炼产品架构思维的4个维度
  8. linux声卡测试命令,linux添加声卡驱动使用命令行音频播放器的方法
  9. windows下mysql备份
  10. 孙鑫-MFC笔记一--Windows程序内部运行机制
  11. (转)微服务架构的理论基础 - 康威定律
  12. JavaWeb学习笔记(2)-B站尚硅谷
  13. 资源池以及资源池化是什么意思?
  14. 设置公众号字体大小不跟随微信浏览器字体大小变化
  15. 网站建设流程-面向公司
  16. 钉钉机器人智能提醒_使用钉钉机器人定时发送消息
  17. ffmpeg视频剪辑视频长度问题,视频无声音,视频卡顿问题
  18. Android选择颜色,尺码联动
  19. pool(三)——Timer
  20. 搭建webdav文件共享服务器,使用Nginx搭建WebDav作为简易共享空间

热门文章

  1. xml和map相互转化
  2. android 平板 吃鸡,吃鸡不卡的安卓平板
  3. minicom - 友好易用的串口通信程序
  4. 上海七宝惊现海宝美眉
  5. 视频教程-5小时零基础入门小程序云开发-微信开发
  6. 华硕 PRIME Z490-PLUS+i7-10700K黑苹果EFI引导文件
  7. oracle甲骨文账号-用于下载oracle JDK
  8. 阿里云自助建站+模板建站+功能定制建站如何选择,详细教程
  9. 硬件参数 调整 麦克风MIC灵敏度 原理
  10. 富途入金步骤记录(个人使用)