It was awful tasting medicine, but I guess the patient needed it. Sometimes life hits you in the head with a brick. Don’t lose faith
— Steve Jobs, Stanford Report, June 14, 2005
物理系统与碰撞
物理引擎
作用: 物理引擎(Physics Engine)是一个软件组件,它将游戏世界对象赋予现实世界物理属性(重量、形状等),并抽象为刚体(Rigid)模型(也包括滑轮、绳索等),使得游戏物体在力的作用下,仿真现实世界的运动及其之间的碰撞过程。即在牛顿经典力学模型基础之上,通过简单的 API 计算游戏物体的运动、旋转和碰撞,现实的运动与碰撞的效果。
实现: 随着技术的进步,作为典型密集计算场景,物理引擎逐步形成了两大流派,分别对应以 NVIDIA 为代表的 PhysX 和 以 Intel +AMD 为代表的 Havok 两大平台。
作业与练习
改进飞碟游戏
技术要求
- 按 adapter模式 修改飞碟游戏
- 使它同时支持物理运动与运动学(变换)运动
游戏说明
游戏内容
一个简单的鼠标打飞碟(Hit UFO)游戏
游戏规则与设定
- 游戏有 4 个 round,每个 round 都包括10 次 trial;
- 每个 trial 的飞碟的色彩、大小、发射位置、速度、角度、同时出现的个数都可能不同。它们由该 round 的 ruler 控制;
- 每个 trial 的飞碟有随机性,总体难度随 round 上升;
- 鼠标点中得分,得分规则按色彩、大小、速度不同计算,规则可自由设定。
完成情况
游戏界面如下:
项目设计
首先创建需要的游戏元素,如飞碟的预制、Terrain等,关于代码编写,首先是继承上一次项目“HitUFO-动作分离版”的成果,实现部分的代码复用,项目的文件结构如下:
优化了上一次的一个逻辑漏洞,最初把 Hit 的调用放在了 InteracteGUI 的 OnGUI 中,实际上根据逻辑,应该保留在 FirstController 中,否则会出现一个 bug,当点击到一个 UFO 时可能会计算多次得分,就此做了改动,消除该 bug,如下:
1 | // FirstController.cs: void Update () |
新增了每个 round 后 miss 的 UFO 数目的统计,并可以在 GUI 上显示出来。
新增了PhysicsEngineAction.cs,和 Action.cs 差不多,刻画了UFO的动作,但实现了运动对象的实例化。
PhysicsEngineAction.cs:
1 | public class PhysicsEngineAction : SSActionManager, SSActionCallback, PhysicsEngineManager |
其他部分继承了上次项目的代码,仅有稍微改动,具体如下:
SSDirector.cs:实现动作基类。
1 | public class SSDirector : System.Object { |
SSAction.cs:实现SSAction、CCMoveToAction和SSActionManager类,增加了CCPhysicsEngine类。
1 | using System.Collections; |
Action.cs:刻画了UFO的动作,上个版本完全由它负责动作管理。
1 | public class Action : SSActionManager, SSActionCallback |
FirstController.cs:场记,该脚本需添加到 Empty 物体上,实现了游戏的开始、进行、结束和点击事件。
1 | public class FirstController : MonoBehaviour, ISceneController, UserAction |
UFO.cs:采用了工厂模式来实现UFO的生产以及复用。
1 | // UFO 基本属性 |
Interfaces.cs:接口,对新的场记和新的控制器进行了链接。
1 | namespace Interfaces |
InteracteGUI.cs:实现GUI。
1 | public class InteracteGUI : MonoBehaviour |
项目地址
代码地址:https://github.com/CUFMHeart/3D-Game-Programming-Design/tree/master/homework6/
视频地址:https://www.bilibili.com/video/av71623568/
参考资料
[1] 物理系统与碰撞_教学讲义
[2] Maunal