本次作业是二选一作业,我挑选的是改进飞碟作业一项。
1、改进飞碟(HitUFO) 游戏:
1.按adapter模式设计图修改飞碟游戏
2.使它同时支持物理运动与运动学(变换)运动
源代码:https://github.com/ShirohaBili/UnityGame/tree/master
演示视频:打飞碟小游戏 物理引擎版
实际上,本次代码和上次写的可以说十分相似,仅仅只是添加物理引擎的调用即可。因此我不会将上次有过的代码再发,仅列出主要变动的代码如下:
DiskFlyAction
public override void Update() {
//计算物体的向下的速度,v=at
// time += Time.fixedDeltaTime;
// gravity_vector.y = gravity * time * 0.1f;
// //位移模拟
// transform.position += (start_vector + gravity_vector) * Time.fixedDeltaTime;
// current_angle.z = Mathf.Atan((start_vector.y + gravity_vector.y) / start_vector.x) * Mathf.Rad2Deg;
// transform.eulerAngles = current_angle;
// if (this.transform.position.y < -10) {
// this.destroy = true;
// this.callback.SSActionEvent(this);
// }
}
private void FixedUpdate() {
if (this.transform.position.y < -10) {
gameobject.GetComponent<Rigidbody>().velocity = new Vector3(0, 0, 0);
// gameobject.GetComponent<Rigidbody>().angularVelocity = new Vector3(0, 0, 0);
// gameobject.GetComponent<Rigidbody>().speed.X = new Vector3(0, 0, 0);
this.destroy = true;
this.callback.SSActionEvent(this);
}
}
上面的Update为前一次作业的写法,此处列出主要是为了更明显地作对比。本次作业因为要引用物理引擎,所以需要用FixedUpdate()来更新动作,可见,在物理引擎的作用下,无需我们自己写运动方法,仅需列出我们需要它更新的动作。
FlyActionManger
public void DiskFly(GameObject disk, float power) {
disk.GetComponent<Rigidbody>().isKinematic = false;
int lor = 1;
if (disk.transform.position.x > 0) lor = -1;
fly = DiskFlyAction.GetSSAction(lor, power);
this.RunAction(disk, fly, this);
}
这里的DiskFly和之前的不一样,输入Power,利用物理引擎自动计算。
Controller和SSActionManger
更改或加入一下调用即可。
//Controller
action_manager.DiskFly(curDisk, power * 3); //更新一下前面更改的DiskFly的调用
//SSActionManager
ac.FixedUpdate(); //在SSActionManager中加入物理引擎的调用
其他更改
- 之前使用运动学变换运动时,因为方便回收和设置速度,所以直接回收不会有问题,但利用物理引擎时,直接更改速度似乎会出问题,回收时飞盘没法更改速度,因此我将它的角阻力加到了1k,并在飞盘下面加上了一个平台接着它们,防止速度过快(不加飞盘会一直自由落体,速度会非常快)
- 在一些影响不大的类中加入了支持FixedUpdate的方法,有点杂,就不列出来了。