UML图
UML要求如下:
本次设计需要我们实现通过物理控制飞碟运动
具体实现
刚体组件
首先需要在飞碟上加上刚体组件
PhysicsDiskFlyAction
将原本的DiskFlyAction替换为PhysicsDiskFlyAction,加入FixedUpdate适配物理引擎,SSAction中也加入PhysicsDiskFlyAction。
public class PhysicsDiskFlyAction : SSAction {
private Vector3 start_vector;
public float power;
private PhysicsDiskFlyAction() { }
public static PhysicsDiskFlyAction GetSSAction(int lor, float power) {
PhysicsDiskFlyAction action = CreateInstance<PhysicsDiskFlyAction>();
if (lor == -1) action.start_vector = Vector3.left * power;
else action.start_vector = Vector3.right * power;
action.power = power;
return action;
}
public override void Update() { }
public override void FixedUpdate() {
if (transform.position.y <= -10f) {
gameobject.GetComponent<Rigidbody>().velocity = new Vector3(0, 0, 0);
this.destroy = true;
this.callback.SSActionEvent(this);
}
}
public override void Start() {
gameobject.GetComponent<Rigidbody>().AddForce(start_vector*3, ForceMode.Impulse);
}
}
DiskFlyActionManager
将原本的DiskFlyAction改为物理版本
public class DiskFlyActionManager : SSActionManager {
public PhysicsDiskFlyAction ph_fly;
public FirstController myscenecontroller;
protected void Start() {
myscenecontroller = (FirstController)SSDirector.GetInstance().CurrentScenceController;
myscenecontroller.actionmanager = this;
}
public void DiskFly(GameObject disk, float power)
{
disk.GetComponent<Rigidbody>().isKinematic = false;
int loc = disk.transform.position.x < 0 ? 1 : -1;
ph_fly = PhysicsDiskFlyAction.GetSSAction(loc, power);
this.RunAction(disk, ph_fly, this);
}
}
效果
与之前类似