HW6:物理系统与碰撞

作业要求:改进打飞碟游戏
 游戏内容要求:
 按下面adapter模式设计图修改飞碟游戏
 使它同时支持物理运动与运动学(变换)运动

1. 物理引擎的改进版本思路与实现
由于游戏逻辑和界面都没有必要改变,物理引擎的引用就是关于飞碟运动的部分,所以仅仅需要对Action相关的类进行改进即可。

在原来的类的基础上,加上利用物理引擎的组件RigidBody进行物体的运动。
RigidBody主要用到以下功能:

自动添加重力,也就是勾选的Gravity(默认),也就是说不必思考如何向下加速的运动
AddForce的函数,给物体施加力。这里的目的主要是给物体一个初速度让其模拟飞碟被抛出的运动,所以这个力不必持续施加,只需在飞出的时候添加一段极小时间即可。所以选择使用ForceMode.Impulse这个模式,瞬间力,符合我们的目的。
至于物体碰撞旋转之类的,可以通过冻结某个轴的旋转来使飞碟更加稳定。
好,那么接下来,我们需要添加一个物理运动的类,基类还是基本的SSAction,只需要继承并实现多态即可。

PhysicsAction

直接上代码:

为了代码能够服用,函数传入参数不做改变,但是内在逻辑改变,也就是说行为变化,但是接口还是同一个,实现多态。由于在运动学实现中,需要目标方向,以及一个速度,而物理引擎中,是通过添加力的方式来实现运动,所以这里简单将目标方向target和speed相乘,表示力的方向和大小。然后返回action
在Update里,由于力不能持续施加,所以需要判断是否第一次施加。施加了之后物体就有一个初速度,然后随着重力的作用,做抛物线运动。

PhysicsManager

动作管理器也类似,保持函数接口不变,直接执行RunAction就可以了,但是有一点要注意的是,由于飞碟工厂在创建的时候并不知道是否采用物理运动,所以不会飞碟实例添加刚体,需要在动作管理器实现给物体添加刚体,注意飞碟会复用,不能重复添加。

新接口类IActionManager

由于两个类(物理运动和运动学)都有同样的函数,不同的实现,而在Controller里面调用的时候,需要一个统一的接口所以新建一个接口:

动作管理器基类的变化

由于动力学和物理运动使用的更新帧函数是不同的(一个FixedUpdate,一个Update)所以在管理器中也应当实现两个Update函数,分别执行动作类的两个Update函数。
代码如下:

Controller变化

由于需要选择运动的模式,所以需要另外创建一个枚举变量,设置不同的状态,并且给控制器添加相应的动作管理器:

UI变化

在UI上设置相应的按钮,在游戏开始的时候设置相应的Mode就可以了。相当于将原本的Play按钮分裂成两个Mode选择按钮:

UI效果如下:

 

改进后的游戏效果:

 


 

猜你喜欢

转载自blog.csdn.net/weixin_40552127/article/details/128237329