Unity3d 打飞碟-物理运动版
题目要求
改进飞碟(Hit UFO)游戏:
- 按 adapter模式 设计图修改飞碟游戏;
- 使它同时支持物理运动与运动学(变换)运动。
Adapter 模式
-
运动学和动力学的物体运动存在区别。在 unity3d 中两种方式会产生不同的效果。使用 adapter 模式,使得游戏能支持两种方式的运动。
-
uml 图变化如下,增加了一个接口和方法,场景控制器通过接口调用该方法,而具体的不同的动作控制类将实现该接口,方便场控的调用。
实现
效果如下
- 和上一个版本的主要区别是添加了刚体后,飞碟碰撞会反弹。
主要写一下修改的地方。
接口
- 根据模式变化,需要修改接口。新加一个
IActionManager
接口。另外,在userAction
中添加了getMode()
,switchMode()
方法,方便 GUI 获取当前模式和在动力学 (Dynamics) 模式,即物理运动,和运动学 (Kinematics) 模式之间进行切换。
namespace Interfaces {
public interface ISceneController {
}
public interface UserAction {
void Hit(Vector3 pos);
int getScore();
int getRound();
bool getMode();
void stopGame();
void Restart();
void switchMode();
}
public enum SSActionEventType: int {
Started, Completed}
public interface ISSActionCallback {
void SSActionCallback(SSAction source);
}
public interface IActionManager {
void MoveDisk(Disk disk);
}
}
CCPhysisAction 的添加
- 和
CCMoveToAction
一个道理,CCPhysisAction
也是一个继承了SSAction
的具体的运动类。CCMoveToAction
是基于运动学的动作变换,是通过计算物体中心的运动方程,轨迹,位移,速度,旋转来直接变换游戏对象;CCPhysisAction
考虑了物体实际的重力和本身的形状,外部力对物体的影响,使游戏对象的运动更加逼真。 - 通过物理引擎更新的
CCPhysisAction
类需要使用FixedUpdate
(尽管这里只需要在start()
中赋一次初始速度,无需在 FixedUpdate 中一直添加速度,但为了区别,我还是写了一个FixedUpdate
),所以在其继承的SSAction
中添加了一个FixedUpdate
虚函数,然后在CCPhysicAction
中实现。而需要重写的Update
函数空着即可。
public class CCPhysisAction : SSAction {
public float speedx, speedy, speedz;
public float gravity = 0.0f;
private CCPhysisAction